왜 내 crontab이 트리거되지 않았습니까?


29

내가 사용하는 crontab -e내의 crontab에 다음 줄을 추가 :

* * * * * echo hi >> /home/myusername/test

그러나 테스트 파일이 작성되었음을 알 수 없습니다. 이것은 권한 문제입니까, 아니면 crontab이 올바르게 작동하지 않습니까?

cron 프로세스가 실행되고 있음을 알았습니다. 이것을 어떻게 디버깅 할 수 있습니까?

편집 -Ask Ubuntu는 crontab대해 좋은 질문 을하지만 불행히도 여전히 도움이되지 않습니다.

편집 2- 흠, 내 테스트 파일에 214 줄이있는 것 같습니다. 즉, 마지막 214 분 동안 매분마다 쓰여졌습니다. 문제가 무엇인지 잘 모르겠지만 분명히 사라졌습니다.

답변:


23

cron매분마다 업데이트 된 crontab 파일을 확인하고 다음 분까지 새로운 항목을 고려하지 않는 구현이 있습니다 (모두는 아니며 어떤 오프 손을 기억하지 않지만 Linux에서 하나를 만났습니다). . 따라서 crontab을 처음 시작하는 데 최대 2 분이 걸릴 수 있습니다. 이것은 당신이 관찰 한 것일 수 있습니다.


1
솔라리스, 또는 아마도 초기 솔라리스 일 것입니다. crontab 항목에서 스크립트를 테스트 할 때 cron 항목을 나중에 3-5 분 동안 실행하는 습관이 있습니다.
Bruce Ediger

fcron이것도 마찬가지입니다.
phunehehe

"체크"루틴이 몇 분 이상 소요되면 어떻게합니까? 이 긴 "확인"동안 트리거되지 않은 cronjob이 발생합니다.
ospider

@ospider이 검사는 몇 초만 걸립니다.
질 'SO-정지 존재 악마'

28

cronjob 뒤에 빈 줄 을 추가 했습니까 ?


내 cronjob 뒤에 빈 줄이 있습니다.
ripper234

4
빈 줄이 아니라 마지막 줄 끝에 줄 바꿈. 텍스트 파일은 줄 바꿈으로 끝나는 일련의 줄로 구성되어 있으므로 비어 있지 않은 텍스트 파일은 줄 바꿈 문자로 끝납니다. 일부 유틸리티는 파일에서 마지막 개행 후에 아무것도 처리하지 않습니다.
Gilles 'SO- 악한 중지'

1
이것은 용어의 문제입니다. "줄 바꾸기 문자"는 "이 문자가 줄 바꿈을 시작한 후"를 의미합니다. 따라서 마지막 줄 바꿈과 EOF 사이의 0 바이트는 빈 줄 ( "0자를 포함하는 줄")로 간주 될 수 있습니다.
gelraen

10

나는 같은 문제가 있었다-끝에 새로운 항목을 추가 한 후 작동하는 crontab이 갑자기 중지되었습니다. 마지막 줄 다음에 줄 바꿈을 잊어 버린 것으로 나타났습니다.

나는 명령을 내려서 알았다

cat /var/log/syslog | grep crontab

결과는 문제를 보여주었습니다.

Jul  2 08:16:01 shiva cron[1254]: (*system*) RELOAD (/etc/crontab)
Jul  2 08:16:01 shiva cron[1254]: (*system*) ERROR (Missing newline before EOF, this crontab file will be ignored)

개행을 추가하고 저장하면 문제가 해결되었습니다.


5

이 소리는 고정되어 있습니다. 다음에는 STDERR도 기록해보십시오. 다음은 STDERR이 아닌 STDOUT에만 로그합니다.

* * * * * echo hi >> /home/myusername/test

STDERR에 대한 명시 적 절도 있는지 확인하십시오. 그렇지 않으면 Cron의 구성 방식에 따라 STDERR이 전자 메일을 통해 사용자에게 전자 메일을 보내거나 (전자 메일이 작동한다고 가정) 전혀 전송되지 않을 수 있습니다.

* * * * * echo hi >> /home/myusername/test 2> /home/myusername/test.stderr

내 취향은 syslog에 cronjob에 출력을 보내는 것입니다. 그렇게하면 기존의 syslog 인프라 (중앙 syslog, Splunk, 이미 지원되는 로그 회전, / var / log / messages & / var / log / cronjob 등의 메시지를 쉽게 비교할 수 있음)를 이용하고 있습니다. 불필요한 이메일로 sysadmins (me)를 스팸 발송합니다.

* * * * * echo hi >> /home/myusername/test 2>&1 | /usr/bin/logger -t mycronjob

2

나에게 문제는 스크립트가 실행 가능하지 않다는 것이었다. 나는 이런 식으로 crontab -e 설정을했다.

* * * * * /bin/my-script.sh

그리고 myscript 파일이 실행 가능하지 않아서

chmod +x my-script.sh

즉시 예상대로 출력을보기 시작했습니다.


1

로 변경 myusernae하면 컴퓨터에서 cron 라인이 제대로 작동합니다 phunehehe. 시스템에 어떤 문제가 있는지 알아내는 방법에는 여러 가지가 있습니다.

Cron은 일반적으로 문제가있을 때 사용자에게 메일을 보냅니다. "메일이 있습니다"라는 메시지가 표시되면 메일 클라이언트를 사용 하여받은 편지함확인하십시오 . 또는 홈 디렉토리를 확인하십시오 dead.letter. 이름 이 지정된 파일이있을 수 있습니다 .

/var/log/cron과 관련된 항목을 확인할 수 있습니다 . 내 컴퓨터에서 로그 파일은 /var/log/cron/current(루트 액세스 필요)에 있습니다.

루트 액세스 권한이 있으면 cron 데몬을 중지하고 디버그 모드에서 시작할 수 있습니다. 예를 들어 ( fcron데몬 이름으로 변경) 을 사용 합니다.

killall fcron
fcron --foreground --debug

데몬의 이름을 어떻게 알 수 있습니까?
ripper234

@ ripper234를 사용 ps -ef | grep cron하면 cron에 대한 줄을 볼 수 있습니다. cron의 man 페이지에서 디버그 플래그를 확인하십시오. Vixie Cron을 사용하고있을 가능성이 높습니다 .이 경우 디버그 플래그는 -x입니다. cron 프로세스를 종료하고 추가 플래그를 사용하여 다시 시작하십시오.
phunehehe

/ var / log / syslog도 확인하십시오. 필자의 경우 cron 파일이 그룹 쓰기 가능하다는 경고가있었습니다.
모드를 잘 치료하십시오

1

cron이 실패하면 해당 컴퓨터에서 cron 작업의 사용자 ID에 대한 이메일을 생성합니다. 컴퓨터에서 MTA가 작동하지 않거나 다른 곳에서 해당 메일을 읽거나 전달하지 않으면 MTA가 작동하더라도 해당 메시지가 표시되지 않습니다.

메일을 통해 crontab의 오류를 얻는 좋은 방법은 crontab을 다음과 같이 만드는 것입니다.

MAILTO="myemail@example.com"
* * * * * echo hi >> /home/myusernae/test

당연히 myemail@example.com 대신 이메일 주소를 사용하십시오. 이것은 cron에게 로컬 계정이 아닌 이메일 주소로 오류를 보내도록 지시합니다. 특히 이것은 단지 출력을 보내려는 루트 crontab (또는 /etc/cron.d의 crontab 프래그먼트)이있는 경우에 유용합니다. 루트 사서함이나 루트 전달 주소를 스팸으로 보내는 것을 피할 수 있습니다.


시스템에 SMTP / 발신 메일 서버가 구성되어 있는지 모르겠습니다. 이상한 점은 그렇지 않다는 것입니다.
ripper234

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.