![!/bin/sh -xv](https://rvso.com/image/1417140/!%2Fbin%2Fsh%20-xv.png)
Centos 7.0/6.5を使用しています。/etc/cron.hourly/mail.cronの内容
#!/bin/sh
log=/var/log/mail.cron.log
echo "`hostname` `date`" >> $log 2>&1
mailx -s "test mail" [email protected] < $log
/var/log/mail.cron.logの結果
myhost Mon Jul 28 11:01:01 CST 2014
しかし、件名は正しいが、空の電子メールが届きました。そこで、この cron を手動でテストしました。すると、正しい電子メールの内容が届きました。
myhost Mon Jul 28 11:01:01 CST 2014
myhost Mon Jul 28 11:30:29 CST 2014
関連するログはこちら/var/log/cron
Jul 28 11:01:01 myhost run-parts(/etc/cron.hourly)[24577]: starting mail.cron
Jul 28 11:01:02 myhost run-parts(/etc/cron.hourly)[24605]: finished mail.cron
この問題をどのようにデバッグすればよいのか疑問に思います。
答え1
試してみることがいくつかあります。
!/bin/sh -xv
- 2>>&1 のように 2 つの大なり記号を使用して stderr をリダイレクトしてみてください。
最初の方法では、スクリプトのステップごとの出力が得られます。まずは stderr をログ ファイルにリダイレクトせずに試してください。Cron は出力のコピーをメールで送信します。どこで問題が発生したかを正確に確認できます。
2 つ目。stdout を破壊しているエラーがあるのかもしれませんか? (おそらくそうではありません。CentOS 6.5 では動作しています。)
cat を使用して印刷できない文字をチェックすることもできます。
cat -vet /etc/cron.hourly/mail.cron
さらに試してみるとよいことは、コマンドへの絶対パスを使用することです。echo の代わりに /bin/echo、date の代わりに /bin/date、hostname の代わりに /bin/hostname を使用します。(ymmv) Jim の言うとおり、cron は常に同じ対話型ユーザーと同じ環境を使用するわけではありません。
答え2
コメントのとおり、ジョブが機能することは間違いありcron
ませんが、ログイン中に手動でジョブを実行してテストしました。問題は、実行されるジョブがcron
現在のユーザーの設定と環境変数を考慮していないことです。そのため、.bash_profile
スクリプトで電子メールを送信する前の手順として、ユーザーの設定ファイルをソースとして取得する必要がある可能性があります。
スクリプトを次のように変更します。
#!/bin/sh
source $HOME/.bash_profile # or whatever profile file or setting you are using
log=/var/log/mail.cron.log
echo "$(hostname) $(date)" >> $log
mailx -s "test mail" [email protected] < $log
cron
はシェルについて何も知りません。シェルはシステムによって起動されるため、最小限の環境しかありません。プログラムを見つけたり、システムにインストールされているユーティリティを実行したりできるようにするには、まずそれらの場所をシェルに知らせる必要があります。これは、.profile
スクリプトの先頭で変数を設定することで行うことができます。
役に立つリンク:
答え3
いくつかの回答は得られましたが、明確な有効な回答は得られませんでした。私の場合は、cron を次のように設定するとうまくいきました。
*/5 * * * * /fullpath/cron.sh | ( body="$(cat)"; if [[ -n $body ]]; then echo "$body" | mail -s "Cron スクリプトの出力"[メールアドレス]; フィ)
これは出力をキャプチャしてメールに送信しますが、スクリプトで実行しているときでも空のメールが届きます。(colucix に感謝)