简要描述;简介
我有一个自定义的 cron 脚本,每天在树莓派上运行。它每天晚上 8 点运行,但每次脚本中的某个命令都会失败。然而,当我以 root ( sudo su
) 身份登录并启动脚本时,它总是工作正常。所以我手动无法触发错误,而必须每次等待 cron 作业运行,才能对其进行故障排除(到目前为止没有成功)。
问题:我还能做什么来更好地模拟从 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...
语句上失败,继续执行下一条语句。这是通过电子邮件发送的 cron 作业输出的一部分
...
***** 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
注意:在编写时,我注意到最后一行的路径错误。我刚刚修复了它,但这应该不会产生任何影响