루트 크론 작업을 올바르게 설정하는 방법

루트 크론 작업을 올바르게 설정하는 방법

나는 Bash 스크립트를 루트로 실행하고 매시간, 매일, 매달 7,37분에 실행되도록 루트 크론 작업을 설정하려고 했습니다. 이 스크립트는 에 위치하고 /usr/bin이름이 지정 됩니다 tunlrupdate.sh. Tunlr의 DNS를 업데이트합니다.

$ ls -l /usr/bin/tunlrupdate.sh 
-rwxr-xr-x 1 root root 2133 Sep 24 15:42 /usr/bin/tunlrupdate.sh

이 Bash 스크립트를 사용할 수 있습니다여기.

호출되면 스크립트는 다음에 있는 로그에 무슨 일이 일어나고 있는지 기록합니다./var/log/tunlr.log

이 루트 크론 작업을 추가하기 위해 루트의 crontab 표준을 사용했습니다.

sudo crontab -e

그리고 마지막에 이 2줄을 삽입했습니다. cron이 스크립트를 루트로 실행할 것으로 예상합니다.

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * root /usr/bin/tunlrupdate.sh

이후 명령을 통해 sudo crontab -l크론 작업이 삽입되었음을 확인했습니다.

Ubuntu를 재부팅하고 cron 작업이 제대로 시작되었는지 로그 파일을 확인하고 있었습니다. 그러나 로그 파일에는 /var/log/tunlr.log작업이 성공적으로 시작되지 않았음을 의미하는 내용이 없습니다 .

명령줄에서 스크립트를 실행하면 확인했습니다.

sudo /usr/bin/tunlrupdate.sh

그러면 그에 따라 로그 파일이 업데이트됩니다.

내 시스템에서 이 크론 작업이 계획대로 실행되지 않는 이유는 무엇입니까?

업데이트 1: 지금까지 제안된 모든 솔루션이 작동하지 않습니다. 시스템 로그를 나열할 수 있는 CLI를 제공한 Olli에게 감사드립니다 sudo grep CRON /var/log/syslog. 그러나 CRON 오류가 발생했습니다.

CRON[13092]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ]
&& find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php
/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)

제안된 PATH= 삽입 및 스크립트의 함수에 대한 루트의 절대 경로 사용 또는 여기에 제안된 솔루션이 없습니다. 여전히 이 오류가 발생합니다.

/usr/lib/php5/maxlifetime몇 번 검색한 후 설명된 대로 파일의 오류를 정확히 찾아냈습니다.여기:Change #!/bin/sh -e --> #!/bin/sh -x

그런 다음 내 시스템에 CRON 오류 로그를 나열합니다.

sudo grep CRON /var/log/syslog
Feb 11 18:07:01 Marius-PC CRON[14067]: (root) CMD (root /usr/bin/tunlrupdate.sh)
Feb 11 18:07:01 Marius-PC CRON[14066]: (root) MAIL (mailed 1 byte of output; but got
status 0x00ff, #012)

아직도 bash 스크립트가 실행되지 않습니다. 이번에는 로그에 오류가 표시되지 않습니다. 이것이 스크립트의 내용이 아니라는 것을 확인하기 위해 스크립트를 다음 3줄로 줄였습니다.

#!/bin/bash
LOGFILE=/var/log/tunlr.log
echo $LOGFILE >> $LOGFILE

아직 크론 작업을 완료하지 못했습니다. 로그 파일에는 아무 것도 기록되지 않습니다. 그렇다면 빈 스크립트가 cron에서 실행되지 않을 수도 있습니까? 이해가 안 돼요. 나는 다음 두 줄로 축소된 스크립트를 시도하고 있다는 것을 알고 있습니다.

#!/bin/bash
exit 0

그리고 여전히 동일한 오류 로그가 나타납니다. cron 스크립트가 통과되지 않습니다 ...

답변1

스크립트를 다음과 같이 실행하려는 경우일반 사용자:

crontab -e

그리고 다음 줄을 추가하세요.

07,37 * * * * /usr/bin/tunlrupdate.sh

스크립트를 다음과 같이 실행하려면뿌리:

sudo crontab -e

그리고 같은 줄을 추가하세요:

07,37 * * * * /usr/bin/tunlrupdate.sh

답변2

글쎄, 마침내 작동하는 솔루션입니다. syslog에서 나는 반복적이고 흥미로운 내용을 보았습니다.

CRON[18770]: (root) CMD (root /usr/bin/tunlrupdate.sh)

루트가 cmd로 인식되지 않은 것 같습니다. 나는 이미 $ sudo /usr/bin/tunlrupdate.sh. 그런 다음 원래 스크립트를 사용해 보았습니다(UNIX cmd 날짜의 실수로 수정됨: 월인 %m이 %M인 분 동안 사용됨). 다음은 cron 라인에서 루트를 제거합니다.

$ sudo crontab -e
# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * /usr/bin/tunlrupdate.sh

이것이 최종 해결책으로 밝혀졌습니다. [비록 cron 라인에 루트가 있는 잘못된 라인을 기술하는 수많은 문헌을 발견했지만. 그건 실수였어.]

답변3

cron의 한 가지 "문제"는 환경 변수가 부족하다는 것입니다(분명한보안상의 이유). 아마도 PATH와 HOME이 누락되었을 수 있습니다. 스크립트에서 직접 정의하거나 crontab 파일에서 정의할 수 있습니다.

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
PATH=/usr/bin
07,37 * * * * root /usr/bin/tunlrupdate.sh

필요한 모든 변수가 스크립트에서 요구하는 대로 정의될 때까지 테스트해야 합니다.

답변4

스크립트에 이 줄을 추가할 수 있습니다. 따라서 cron 로그를 확인하고 작업이 실행되었음을 확인한 후에는 crontab과 동일한 $PATH를 얻을 수 있습니다.

/bin/echo $PATH > /root/path.txt

cron 스크립트에서 문제를 진단하기 위해 할 수 있는 가장 좋은 방법은 스크립트에서 env 명령을 사용하여 SO의 모든 환경 변수를 가져오는 것입니다. 따라서 스크립트에 이 줄을 추가하면 됩니다. 그런 다음 출력을 분석할 수 있습니다.allEvnVars.txt

/usr/bin/env > /root/allEvnVars.txt

또 다른 비결은 스크립트의 출력을 특정 위치로 보내는 것입니다. . /root/log.log​이렇게 하면 스크립트의 모든 출력이 다음과 같이 유지됩니다./root/log.log

07,37 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log

또한 테스트 및 확인을 용이하게 하기 위해 매 분마다 실행되도록 스크립트를 예약할 수 있습니다.

*/1 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log

관련 정보