내 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
[...]
로그를 보시면 아시겠지만 crontab
09: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년 후, 이것이 미래 독자들의 대답이 될 것입니다)