每日 cron 作业失败,而以 root 身份运行作业则不会。如何排除故障?

每日 cron 作业失败,而以 root 身份运行作业则不会。如何排除故障?

简要描述;简介

我有一个自定义的 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注意:在编写时,我注意到最后一行的路径错误。我刚刚修复了它,但这应该不会产生任何影响

相关内容