로그인하지 않으면 cronjob이 실행되지 않습니다.

로그인하지 않으면 cronjob이 실행되지 않습니다.

내 crontab에 cronjob이 있습니다.

2분 안에 실행될 작업을 지정하고 기다렸다가 해당 작업에 의해 생성된 파일을 볼 수 있고 ps로 프로세스를 볼 수 있습니다. 이 작업을 완료하는 데 최소 10분이 소요됩니다.

그런데 2분 후에 실행하도록 작업을 지정하고 로그아웃했다가 몇 분 후에 다시 돌아오면 아직 작업이 실행되지 않은 것 같습니다(파일이 생성되지 않고 ps에서 처리되지 않습니다). .

/var/log/syslog를 보면 작업이 "시작"되는 것을 볼 수 있지만 즉시(동일한 초) cron이 메일 전송을 시도합니다. 아마도 결과가 담긴 이메일일 겁니다. (음, sendmail이 올바르게 구성되지 않았지만 이것이 근본 원인이 되어서는 안 됩니다).

어떤 아이디어가 있나요?


다음은 몇 가지 구체적인 예입니다. (python은 내 컴퓨터의 이름입니다.)

crontab -e를 사용하여 crontab을 편집합니다.
이것은 크론탭입니다:

user@python:~$ crontab -l
[...]
# m h  dom mon dow   command

50 9 * * * /home/user/scripts_automated/crontab1.sh

9시 50분에 실행해야 함

이것은 /var/log/syslog의 내용입니다:

[...]
Nov  6 09:48:02 python crontab[30913]: (user) BEGIN EDIT (user)
Nov  6 09:48:18 python crontab[30913]: (user) REPLACE (user)
Nov  6 09:48:18 python crontab[30913]: (user) END EDIT (user)
Nov  6 09:50:01 python CRON[30936]: (user) CMD (/home/user/scripts_automated/crontab1.sh)
Nov  6 09:50:01 python sendmail[30938]: sA68o1a4030938: from=user, size=347, class=0, nrcpts=1, msgid=<201411060850.sA68o1a4030938@python>, relay=user@localhost
[...]

로그를 보시면 아시겠지만 crontab09:48:02에 수정하고 로그아웃했습니다. (을 사용하여) 컴퓨터로 돌아갔지만 ssh작업에서 예상했던 파일이 생성되지 않았습니다.

스크립트의 내용은 다음과 같습니다.

user@python:~$ cat scripts_automated/crontab1.sh


#  0  ------------------------------------------------------

datenow=`date +%F_%H-%M-%S`
/home/user/scripts_automated/script_1_cisco_grab.sh > /home/user/scripts_automated/crontab/run_${datenow}_.txt 2>&1 &
echo $! > /home/user/scripts_automated/crontab/pid_${datenow}.txt
ln -s /home/user/scripts_automated/crontab/pid_${datenow}.txt /home/user/scripts_automated/crontab/pid_last_run.txt

파일이 생성되지 않습니다. 적어도 pid_${datenow}.txt백그라운드 명령의 pid와 함께 파일이 존재하기를 원합니다. 하지만 아무것도 아니야. 로그아웃하지 않으면 스크립트가 실행되어 출력 파일, pid_${datenow}파일 등을 생성합니다.

답변1

cron 작업이 실행될 때 반드시 사용할 수 있는 별도의 디렉토리(예: )에 스크립트를 배치해야 합니다 /usr/local/bin/.

crontab다음과 같이 항목을 작성하는 것도 좋은 습관입니다.

M H * * *  test -x /usr/local/bin/myscript.sh && /usr/local/bin/myscript.sh

따라서 스크립트를 사용할 수 없으면 crontab은 이를 실행하려고 시도하지도 않습니다.


로그아웃이 문제인 것으로 의심되면 로그아웃한 다음 crontab을 실행하고 관찰할 수 있는 시간에 맞춰 다시 시도해야 합니다. 이렇게 하면 로그아웃이 문제인지 로그인하지 않는 것이 문제인지 범위를 좁힐 수 있습니다.

답변2

로그 파일은 crontab 작업이 트리거되었음을 보여줍니다.

Nov  6 09:50:01 python CRON[30936]: (user) CMD (/home/user/scripts_automated/crontab1.sh)

잠시 후 다음과 같은 이메일이 발송되었습니다.

Nov  6 09:50:01 python sendmail[30938]: sA68o1a4030938: from=user, size=347, class=0, nrcpts=1, msgid=<201411060850.sA68o1a4030938@python>, relay=user@localhost

로그 파일의 다음 줄은 거의 확실하게 이 줄의 보충 줄이며 어디로 가는지 보여줍니다.

이메일이 왜 관련이 있나요? 크론 캡처표준 출력그리고표준 에러모든 직업에서 해고되었습니다. 그 중 하나가 비어 있지 않으면 캡처된 텍스트가 포함된 이메일을 사용자의 로컬 이메일 계정으로 보냅니다. 이 경우 로컬 이메일 계정 user으로 전송됩니다 . user(이메일 하위 시스템을 구성한 경우 오프 사이트로 전달될 수 있지만 지금은 그렇지 않을 것이라고 가정합니다.) 로컬 이메일은 일반적으로 파일 /var/mail/$USER또는 /var/spool/mail/$USER. 따라서 파일을 사용 more하거나 볼 less수도 있습니다 . cat마지막 메시지는 당신이 읽고 싶은 것일 수도 있습니다.

귀하가 작성한 스크립트를 보면 귀하의 경우에 생성된 오류 메시지는 다음과 같을 것 같습니다.

-sh: /home/user/scripts_automated/crontab1.sh: Permission denied

이런 경우는 crontab1.sh프로그램으로 실행을 시도했지만 실행 가능하게 만드는 것을 무시했기 때문입니다. 이 문제를 해결하는 데 사용하십시오 chmod a+x /home/user/scripts_automated/crontab1.sh.

PATH다른 오류는 예상대로 설정되지 않은 것을 포함하여 환경 변수 누락과 관련될 수 있습니다 . cron환경이 매우 제한 되어 있고 .bashrc. .profile또 다른 가능성은 로그인하지 않았을 때 홈 디렉토리가 암호화될 수 있다는 것입니다. 이 경우 cron스크립트가 실행되는 것을 찾을 수 없으므로 단순히 실패합니다. 질문(및 답변)이 많이 있습니다.https://unix.stackexchange.com/그러한 문제를 해결하여 여기서 반복하지 않겠습니다.

일반적으로 스크립트에서 발생하는 또 다른 문제는 스크립트가 #!인터프리터의 경로에서 시작되어야 한다는 것입니다. 그렇다면 bash일반적으로 를 작성하고 #!/bin/bash, 그렇다면 시작을 sh사용 하면 시스템이 스크립트 실행 방법을 이해하는 데 도움이 되지 않습니다.#!/bin/sh# 0 ------------------------------------------------------

(6년 후, 이것이 미래 독자들의 대답이 될 것입니다)

관련 정보