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


35

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

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

sudo crontab -e

그리고이 두 줄을 끝에 삽입했습니다. 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크론 작업이 삽입되었음을 확인했습니다.

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

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

sudo /usr/bin/tunlrupdate.sh

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

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

업데이트 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 작업을 수행하지 않습니다. 로그 파일에 아무것도 기록되지 않습니다. 따라서 빈 스크립트가 cron에서 실행되지 않을 수 있습니까? 나는 그것을 얻지 못한다. 스크립트를 다음 두 줄로 줄인 것을 알고 있습니다.

#!/bin/bash
exit 0

그리고 여전히 동일한 오류 로그. 크론 스크립트는 통과하지 않습니다 ...


"root"cronjob이 되려면 root 여야합니다. 그러면 crontab -e를 입력하십시오. 또한 루트 (콘솔 유형 "su root")로 로그인 한 다음 crontab -e (이 경우에는 sudo가 필요하지 않음)로 로그인하면됩니다.
Wolfgang

잘. 당신의 대답의 요점이 보이지 않습니까? $ sudo crontab -e를 입력하면 $ sudo crontab -l에 의해보고 된대로 작업이 수행되었습니다. 즉, 새 작업을 설명하는 행이 루트의 cron에 추가되었습니다. 그 자체로 작업이 사용자 cron에 존재하지 않습니다. 예를 들어 $ crontab -l cron 작업이 여기에 추가 된 것을 표시하지 않습니다.
Antonio

@ WolffangVogl 그는 예상대로 작동하는 "스도"를 사용했습니다.
Alexis Wilke

답변:


68

일반 사용자 로 스크립트를 실행하려면 다음을 수행하십시오 .

crontab -e

그리고 라인을 추가하십시오 :

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

스크립트를 루트 로 실행하려면 다음을 수행하십시오 .

sudo crontab -e

그리고 같은 줄을 추가하십시오 :

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

@NineCattoRules 출력을 삭제하지 않으면 무엇을 볼 수 있습니까?
Angelo Fuchs

@AngeloFuchs old comment ... 확실히 그 명령을 루트 () sudo crontab -e대신 시도했습니다 crontab -e. 또는 다른 어떤 방법으로도 작동합니다
NineCattoRules

10

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

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

루트처럼 들리는 것은 cmd로 인식되지 않았습니다. 이미 사용하여 루트의 크론을 사용 했으므로 $ sudo /usr/bin/tunlrupdate.sh. 그런 다음 원래 스크립트를 사용하여 시도했습니다 (UNIX cmd : % m은 몇 분 동안 % 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 라인에 루트가있는 잘못된 라인을 나타내는 수많은 문헌을 발견했지만. 그건 실수였다].


좋은 지적이야 올리. 나는 그것에 동의합니다. 참고로 사용자 crontab은 / var / spool / cron / crontabs / user-name 또는 root / var / spool / cron / crontabs / root에 저장됩니다. 이 페이지를 참조하십시오. askubuntu.com/questions/216692/where-is-the-user-crontab-stored 포함 폴더는 이미 있으며 사용자 이름을 제공합니다.
Antonio

crontab명령을 사용 하여 crontab 파일 만 편집해야하므로 해당 정보가 필요하지 않습니다 (아래의 crontab 파일 제외 /etc).
Olli

1
@Antonio 사용자 이름 필드의 점수는 /etc/crontab(시스템 전체 crontab) 에서만 사용됩니다 . sudo crontab -e일반적으로 다음에서 찾을 수있는 루트의 crontab을 사용하여 작업/var/spool/cron/crontabs
Matijs

2

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

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


1
이것은 실제로 나를 위해 일한 유일한 대답입니다. SHELL 및 PATH 문을 /etc/crontab파일 에서 복사하여에 붙여 넣었고 sudo crontab -e명령은 문제없이 루트로 실행되었습니다. 고맙습니다!
Terrance

0

크론 오류 메시지는 일반적으로 이메일을 통해 기본적으로 전송됩니다. 을 (를) 사용하여 root에 대한 이메일이 있는지 sudo mail또는의 내용을 확인하여 /var/mail/root(예 :) 확인할 수 있습니다 sudo less /var/mail/root.


이메일 메시지가 도움이되지 않으면 /var/log/syslog다음 사항 도 확인하십시오 .

sudo grep CRON /var/log/syslog

Alexis Wilke가 이미 말했듯이 cron에는 환경 변수를 설정하는 메커니즘이 다릅니다.

스크립트 필요

PATH=/sbin:/bin:/usr/bin

crontab에. HOME필요하지 않아야합니다. 스크립트에서 절대 경로를 사용해야합니다 (예 : /bin/date대신) date. 당신은 각 명령에 대한 적절한 경로를 찾을 수 있습니다 which command_name, 예를 들어,

$ which date
/bin/date

제안 된 grep CRON을 / var / log / syslog에서 실행합니다. 2 월 11 일 14:37:01 Marius-PC CRON [7826] : (root) CMD (root /usr/bin/tunlrupdate.sh) 2 월 11 일 14 일 : 37:01 Marius-PC CRON [7825] : (root) MAIL (메일 1 바이트 출력; 0x00ff, # 012 상태로 전송 됨) Feb 11 14:39:01 Marius-PC CRON [7849] : (root) CMD ( [-x / usr / lib / php5 / maxlifetime] && [-d / var / lib / php5] && 찾기 / var / lib / php5 / -depth -mindepth 1 -maxdepth 1 -type f -cmin + $ (/ usr / lib / php5 / maxlifetime)! -execdir fuser -s {} 2> / dev / null \; -delete) cron에서 PATH에 대한 정의를 추가해도 시스템 $ PATH에 영향을 미치지 않습니다.
안토니오

그 결과는 이메일을 보내려고했지만 실패했다고합니다. 즉,에 오류 메시지가 표시되지 않습니다 /var/mail/root. 이 문제를 해결하거나 다음과 같이 시도해보십시오PATH=...
Olli

@Antonio는이 패치 버전을
Olli

감사. 시스템 전자 메일을 구성하지 않았으며 통과하지 못했다는 것을 알고있었습니다. 나는 이미 호출 된 함수에 절대 경로를 사용하도록 스크립트를 수정했습니다. 마지막 것은 crontab 내의 PATH 정의가 내 시스템 $ PATH 변수를 망칠 수 없다는 이전의 질문이었습니다.
안토니오

1
그동안 원래 스크립트의 날짜 형식으로 버그를 수정하는 데 바빴습니다. 그것은 % M 대신에 % m (이것은 몇 분 동안은 아닙니다)을 사용
Antonio

0

이 줄을 스크립트에 추가 할 수 있습니다. 따라서 크론 로그를 확인하고 작업이 실행 된 것을 승인하면 크론 탭과 동일한 $ 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 분마다 실행하도록 예약 할 수 있습니다.

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