簡単な紹介;
Raspberry Piで毎日実行されるカスタムcronスクリプトがあります。毎晩午後8時に実行されますが、スクリプトのいずれかのコマンドが失敗するたびに実行されます。ただし、sudo su
root()でログインしてスクリプトを起動すると、常にうまく機能します。したがって、エラーを手動で実行することはできず、問題を解決するために毎回cronジョブが実行されるのを待つ必要があります(これまでは成功しませんでした)。
質問:クローンジョブで実行されているスクリプトの動作とコンテキストをよりよくシミュレートするために何ができますか?
追加の背景情報
スクリプトはNFS共有(My 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
1つの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
注:書き込み中に最後の行のパスが間違っていることがわかりました。直ちに修正しましたが、何の影響もありません。