crontab 스크립트가 작동하지 않는 이유는 무엇입니까?

crontab 스크립트가 작동하지 않는 이유는 무엇입니까?

crontab스크립트가 일정이나 예상대로 실행되지 않는 경우가 많습니다 . 그 이유는 다양합니다.

  1. 잘못된 crontab 표기법
  2. 권한 문제
  3. 환경 변수

crontab이 커뮤니티 위키는 스크립트가 예상대로 실행되지 않는 주요 원인을 집계하는 것을 목표로 합니다 . 각각의 이유를 별도의 답변으로 작성하세요.

답변당 하나의 이유(실행되지 않는 이유에 대한 세부 정보)를 포함하고 해당 이유에 대한 수정 사항을 포함하십시오.

cron 관련 문제(예: 셸에서는 예상대로 실행되지만 cron에 의해 잘못 실행되는 명령)만 작성하세요.

답변1

다른 환경

Cron은 최소한의 환경 변수 세트를 작업에 전달합니다. 차이점을 확인하려면 다음과 같이 더미 작업을 추가하세요.

* * * * * 환경 > /tmp/env.output

작업이 생성될 때 까지 기다린 /tmp/env.output후 작업을 다시 제거하세요. 이제 일반 터미널에서 실행한 /tmp/env.output결과와 내용을 비교해 보세요 .env

여기서 일반적인 "문제"는 PATH환경 변수가 다르다는 것입니다. 어쩌면 귀하의 cron 스크립트가 에 추가한 somecommand에 있는 명령을 사용할 수도 있습니다 . cron은 해당 파일을 무시하므로 cron으로 실행하면 스크립트에서 실행하면 실패하지만 터미널에서 실행하면 작동합니다. 의 변수는 cron 작업으로 전달되지만 cron 변수가 와 같이 특별히 자체적으로 설정되는 것은 아니라는 점에 주목할 가치가 있습니다 ./opt/someApp/binPATH/etc/environmentPATHsomecommand/etc/environmentPATH

이 문제를 해결하려면 PATH스크립트 상단에 고유한 변수를 설정하면 됩니다. 예:

#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# rest of script follows

일부에서는 대신 모든 명령에 대해 절대 경로를 사용하는 것을 선호합니다. 나는 그것에 반대하는 것이 좋습니다. 다른 시스템에서 스크립트를 실행하려는 경우 해당 시스템에 명령이 /opt/someAppv2.2/bin대신 있으면 어떻게 되는지 생각해 보세요. 스크립트의 첫 번째 줄에서 작은 편집을 수행하는 대신 /opt/someApp/bin전체 스크립트를 로 바꿔야 합니다 ./opt/someAppv2.2/bin

모든 cron 작업에 적용되는 crontab 파일에서 PATH 변수를 설정할 수도 있습니다. 예:

PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

15 1 * * * backupscript --incremental /home /root

답변2

내가 가장 잘해야 할 문제: 파일 끝에 개행 문자를 추가하는 것을 잊어버린 경우 crontab. 즉, crontab 파일은 빈 줄로 끝나야 합니다.

다음은 이 문제에 대한 매뉴얼 페이지의 관련 섹션입니다( man crontab그런 다음 끝으로 건너뛰십시오).

   Although cron requires that each entry in a crontab end  in  a  newline
   character,  neither the crontab command nor the cron daemon will detect
   this error. Instead, the crontab will appear to load normally. However,
   the  command  will  never  run.  The best choice is to ensure that your
   crontab has a blank line at the end.

   4th Berkeley Distribution      29 December 1993               CRONTAB(1)

답변3

Cron 데몬이 실행되고 있지 않습니다. 나는 몇 달 전에 이것을 정말로 망쳤습니다.

유형:

pgrep cron 

숫자가 표시되지 않으면(예: cron의 기본 PID) cron이 실행되고 있지 않은 것입니다. sudo /etc/init.d/cron startcron을 시작하는 데 사용할 수 있습니다.

편집: /etc/init.d를 통해 init 스크립트를 호출하는 대신 서비스 유틸리티를 사용하십시오. 예:

sudo service cron start

편집: 또한 최신 Linux에서는 systemctl을 사용할 수도 있습니다. 예:

sudo systemctl start cron

답변4

많은 환경에서 cron은 를 사용하여 명령을 실행 sh하지만 많은 사람들은 를 사용할 것이라고 가정합니다 bash.

실패한 명령에 대해 이를 테스트하거나 수정하기 위한 제안:

  • sh작동하는지 확인하려면 다음 명령을 실행해 보세요 .

    sh -c "mycommand"
    
  • bash 하위 쉘에 명령을 래핑하여 bash에서 실행되는지 확인하세요.

    bash -c "mybashcommand"
    
  • crontab 상단에 셸을 설정하여 bash에서 모든 명령을 실행하도록 cron에 지시합니다.

    SHELL=/bin/bash
    
  • 명령이 스크립트인 경우 스크립트에 shebang이 포함되어 있는지 확인하세요.

    #!/bin/bash
    

관련 정보