간략한 소개;
Raspberry Pi에서 매일 실행되는 사용자 정의 cron 스크립트가 있습니다. 매일 밤 오후 8시에 실행되지만 스크립트의 명령 중 하나가 실패할 때마다 실행됩니다. 그러나 sudo su
루트()로 로그인하고 스크립트를 시작하면 항상 잘 작동합니다. 따라서 오류를 수동으로 실행할 수 없으며 문제를 해결하기 위해 매번 cron 작업이 실행될 때까지 기다려야 합니다(지금까지는 성공하지 못했습니다).
질문:크론 작업에서 실행되는 스크립트의 동작과 컨텍스트를 더 잘 시뮬레이션하기 위해 또 무엇을 할 수 있습니까?
추가 배경 정보
스크립트는 NFS 공유(내 Synology NAS에 호스팅됨)를 마운트하고 일부 IMAP imap 계정을 NFS 공유에 동기화한 다음 Mercurial을 사용하여 새 상태를 커밋합니다.
me@mango:/etc/cron.daily8pm$ ls -l
total 4
-rwxr-xr-x 1 root root 1722 Jun 6 22:08 backupimaps
me@mango:/etc/cron.daily8pm$
스크립트의 관련 부분을 표시합니다.
me@mango:/etc/cron.daily8pm$ sed -n '38,47p' backupimaps
echo Performing IMAP backup\(s\)
#use basic interface (=noninteractive, good for cron)
offlineimap -u basic -c /etc/offlineimaprc
if [ $? -eq 0 ]; then
echo "Committing changes (addremove)..."
hg addremove --verbose -R $MOUNTDIR <--- failure on this command
echo "Committing changes (real commit)..."
hg commit -u "cronjob $USERNAME @ $HOSTNAME" -m "Autocommit @ $TIMESTAMP" -R $MOUNTDIR
else
me@mango:/etc/cron.daily8pm$
cron 작업으로 실행하면 항상 hg addremove --verbose -R $MOUNTDIR
한 abort: Permission denied...
문에서 실패하고 다음 문에서 계속됩니다. 이는 이메일로 전송된 크론 작업 출력의 일부입니다.
...
***** Finished processing account fmklaske
Committing changes (addremove)...
removing fmxxxxx/INBOX.Archief/cur/1439586438_1.7100.voyage,U=3233,FMD5=178b19d5fa680033b330f587796f66de:2,S
...
adding fmyyyy/INBOX/new/1496858746_2.3294.mango,U=59804,FMD5=7e33429f656f1e6e9d79b29c3f82c57e:2,
abort: Permission denied: '/mnt/imapbackup/fmxxxxx/INBOX.HOTMAIL OUD/cur/1496858720_0.3294.mango,U=18109,FMD5=7ae3c37de1c6bb870abee958daf1c6f6:2,S'
Committing changes (real commit)...
nothing changed (37 missing files, see 'hg status')
작업을 수동으로 실행하면 성공적으로 완료되고 변경된 파일이 예상대로 커밋되기 때문에 왜 실패하는지 모르겠습니다. 또한 실패를 보고하는 이메일은 특별하지 않으며 권한도 괜찮아 보입니다.
자세한 배경 정보는 다음을 참조하세요.
me@mango:/etc/cron.daily8pm$ sudo tail -n 3 /var/log/cron.log
Jun 7 19:17:01 mango CRON[3231]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 7 20:05:01 mango CRON[3284]: (root) CMD ( test -x /usr/sib/anacron/ || ( cd / && run-parts --report /etc/cron.daily8pm ))
Jun 7 20:17:01 mango CRON[3431]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
그리고 내 crontab 파일
me@mango:/etc$ cat crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
05 20 * * * root test -x /usr/sib/anacron/ || ( cd / && run-parts --report /etc/cron.daily8pm )
#
me@mango:/etc$
/usr/sib/anacron
참고: 글을 쓰는 동안 마지막 줄의 경로가 잘못되었음을 발견했습니다. 방금 고쳤지만 아무런 영향을 미치지 않을 것입니다.