실망스러운 문제는 cron이나 su -c가 내 작업을 실행하지 않는다는 것입니다(권한?)

실망스러운 문제는 cron이나 su -c가 내 작업을 실행하지 않는다는 것입니다(권한?)

업데이트(그리고끊다) 자세한 내용은 아래를 참조하세요.

cron 스크립트를 설정했는데 왜 실행되지 않는지 디버깅하려고 합니다.[컨텍스트 테스트를 중단하세요. 모두 작동합니다.개정 2 참조세부]도움이 되는 경우 명령 자체는 다음과 같습니다(화살표는 쉽게 읽을 수 있도록 줄 바꿈을 나타냄).

/usr/bin/php -C /etc /path/to/process.php
↪  >>/path/to/stdout.log 2>>/path/to/stderr.log

[권한 테스트가 중단되었습니다. 아래를 참조하세요.개정 2세부]

(다시 한번 가독성을 위해 래핑하여) 확인하면 crontab다음과 같은 결과를 얻습니다.

[blackero@XXXXXXXXXXX to]$ sudo crontab -u cronuser -l
MAIL="blackero@localhost"

30 9 * * * cronuser /usr/bin/php -C /etc /path/to/process.php
↪   >>/path/to/stdout.log 2>>/path/to/stderr.log
20 18 7 * * cronuser /usr/bin/php -C /etc /path/to/process.php
↪   >>/path/to/stdout.log 2>>/path/to/stderr.log
22 18 7 * * cronuser echo "Test" > /path/to/test.txt
↪   2> /path/to/error.txt

업데이트 #12012-02-08 12:32 Z

[스크린샷: 이미 시도했습니다.드 로버트~의제안(개정 3)]cronuser, 스크립트를 올바르게 실행할 수 있고 두 파일 모두에 쓸 수 있다는 것을 알고 있습니다 .log. (스크립트가 수행하는 첫 번째 작업 process.php은 FTP를 통해 파일을 다운로드하는 것입니다. 이 작업도 성공적으로 수행됩니다.) 그러나 해당 MAIL=""줄을 수정한 후에도(삭제하고 MAILTO="blackero@localhost"실행되도록 변경하면 나에게 어떤 이메일도 보내지 않습니다.)

친구가 다시 시도해 보라고 제안했습니다.

 9 12 8 * * cronuser /bin/echo "Test" > /var/www/eDialog/test.txt
 ↪  2> /var/www/eDialog/error.txt

방금 /bin/echo시도했지만 작동하지 않았고 이메일도 생성되지 않아서 당황했습니다.

업데이트 #2게시일: 2012-02-08 19:15 Z

매우 유용한 채팅 대화그리고옥슬린, 문제가 있는 것 같습니다 pam. cron작업을 실행하려고 할 때 마다 /var/log/cron다음 항목이 표시됩니다.

crond[29522]: Authentication service cannot retrieve authentication info
crond[29522]: CRON (cronuser) ERROR: failed to open PAM security session: Success
crond[29522]: CRON (cronuser) ERROR: cannot set security context

다음 줄을 추가하여 이 문제를 해결했습니다 /etc/shadow.

cronuser:*:15217:0:99999:7:::

내가 알아낸 대로포럼에서/etc/shadow, 사용자 가 없으면 pam보안 요청이 계속 처리되지 않습니다. 두 번째 열로 추가한다는 것은 *사용자가 비밀번호를 사용하여 로그인할 수 없음을 의미합니다(해시가 지정되지 않았기 때문에). 문제를 해결하면 에서 다른 오류가 발생하므로 /var/log/cron자세히 조사한 결과 crontab매번 사용자 이름을 지정했음을 발견했습니다.

정정하면 내가 crontab지금 읽은 내용은 다음과 같습니다.

[blackero@XXXXXXXXXXX ~]$ sudo crontab -u cronuser -l
MAILTO="blackero@localhost"

30 9 * * * /usr/bin/php -C /etc /path/to/process.php
↪   >>/path/to/stdout.log 2>>/path/to/stderr.log
52 18 8 * * /usr/bin/php -C /etc /path/to/process.php
↪   >>/path/to/stdout.log 2>>/path/to/stderr.log
9 12 8 * * /bin/echo "Test" > /path/to/test.txt
↪   2> /path/to/error.txt

하지만 /var/log/cron지금 보여주세요:

Feb  8 18:52:01 XXXXXXXXXXX crond[16279]: (cronuser) CMD (/usr/bin/php -C /etc
↪   /path/to/process.php >>/path/to/stdout.log 2>>/path/to/stderr.log)

그리고 아무 것도 stdout.log또는 에 들어 가지 않습니다 stderr.log. 메일이 나에게 전송되지 않았고 /var/log/다른 파일의 항목 중 어느 것도 올바른 시간 프레임에 있지 않았으며 무엇이 잘못되었는지 확인하려면 어디를 봐야 할지 아이디어가 부족합니다.

답변1

먼저 cron 작업이 실패하면 cron이 이메일을 보냅니다. 기본적으로 이는 크론 작업의 소유자입니다. 따라서 이러한 이메일은 cronuser@localhost 또는 root@localhost로 전송될 수 있습니다. 해당 이메일을 확인하세요. 또는 MAILTO=email@domaincrontab 파일 상단에 메일을 보낼 위치를 지정할 수도 있습니다 . (실제로는 MAIL=""crontab의 맨 위에 두신 것으로 보입니다 . 적어도 man 5 crontab내 기계에 따르면 거기에 있어야 합니다 MAILTO. 그리고 당신은아니요작동하지 않는 이유를 알아내려고 할 때 오류 메시지를 버리고 싶습니다! )

둘째, cron이 사용됩니다 /bin/sh. bash 확장이 필요한 경우 이를 설정합니다 SHELL=/bin/bash(다시 crontab 위에).

셋째, 아직 전체 테스트 권한이 없습니다. 다음과 같은 작업을 수행해야 합니다.

# su -s /bin/sh -u cronuser
$ touch /path/to/stdout.log
$ touch /path/to/stderr.log
$ cat /path/to/process.php > /dev/null
$ exit

권한을 철저히 확인하세요. cronuser예를 들어 +x가 상위 디렉터리에 없을 수 있습니다. (/usr/bin/php도 확인해야 할 것 같은데 그게 정상인 것 같아요)

최소 환경에서 명령을 실행해 볼 수도 있습니다.

# su -s /bin/sh -u cronuser
$ env - /bin/sh
$ /usr/bin/php -C /etc /path/to/process.php

작동하는지 확인하세요.

답변2

달리기 crond?

다음 명령 중 하나를 시도해 보십시오.

pidof crond
pgrep -l crond
ps caxf | grep -6 crond --color

마지막 명령의 출력:

11881 ? S 0:00 \_ httpd 
11882 ? S 0:00 \_ httpd 
11883 ? S 0:00 \_ httpd 
11884 ? S 0:00 \_ httpd 
11885 ? S 0:00 \_ httpd 
11886 ? S 0:00 \_ httpd 
2098 ? Ss 0:01 crond             #this 'crond' is in red
2125 ? Ss 0:00 sudoscriptd 
2127 ? Ss 0:00 \_ sudoscriptd 
2136 tty2 Ss+ 0:00 mingetty 
2137 tty3 Ss+ 0:00 mingetty 
2138 tty4 Ss+ 0:00 mingetty 
2139 tty5 Ss+ 0:00 mingetty

구성은 무엇입니까 crond?

/etc/rc.d/init.d시작 파일 을 확인하십시오 /etc/init.d.

구성을 crond나열할 수 있습니다.거절당하다또는/및허용하다사용자.
이 사람이 귀하의 사용자입니까?거절당하다? 다음 파일을 확인하세요.

   /etc/cron.allow
   /etc/cron.deny

두 파일 모두 존재하지 않으면 루트만허용하다. 존재하지 않고
비어 있으면 모든 사용자가cron.allowcron.deny허용하다기본적으로.

이 파일은 /etc/crontab루트만 쓸 수 있어야 합니다.

$ ls -l /etc/crontab
-rw-r--r-- 1 root root 255 Jul 15  2006 /etc/crontab

뭐라고 crond?

정보를 받는 자연스러운 방법 crond은 지역 메일입니다. crond일반적으로 사용됩니다 sendmail. sendmail사용할 수 없는 경우 다른 메일 명령을 지정할 수 있습니다( CRONDARGS="-mmail").

crond하지만 이 단계에서는 직접 로그를 확인하는 것이 가장 좋습니다 ( ll /var/log/cron*).

재시작crond

이 문제는 반복해서 해결될 수 있습니다 crond.

문제가 지속되면 다시 재부팅하기 전에 init.d또는 없이 실행 service하고 다른 옵션을 시도해 보겠습니다.

sudo 크론드 -p -x sch

그리고 로그파일을 다시 확인해 보세요 crond...

답변3

문제를 발견했습니다. 이것-C 명령줄 스위치으로 보낼 php예정입니다. 으로 보내야 합니다 -c. 왜 cron나에게 보고되지 않았는지 모르겠다 .어느유용한 방법(또는 대문자 C를 사용하여 가져왔지만 crontabCLI에서 소문자로 테스트한 방법)은 말할 것도 없고 동료와 함께 CLI에서 다시 실행했습니다.원숭이갑자기 모든 것이 분명해졌습니다.

지금 내가 얼마나 어리석은 기분이 드는가?

글쎄, 적어도 이제 문제는 해결되었고 cron내 스크립트는 원활하게 실행됩니다. 도움을 주셔서 감사합니다.

관련 정보