私はcentos7.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つ目は、スクリプトの段階的な出力を提供します。 stderrをログファイルにリダイレクトせずに、最初に試してみます。 Cronは、出力のコピーをメールで送信する必要があります。あなたはそれがどこでうまくいかないかを正確に見ることができます。
二番目。たぶん、あなたはあなたの標準出力を壊しているエラーを持っていますか? (おそらくそうではありませんが、CentOS 6.5と同じように機能します。)
Catを使用して印刷できない文字を確認することもできます。
cat -vet /etc/cron.hourly/mail.cron
さらにもう1つ試してみるのは、コマンドへの絶対パスを使用することです。echoの代わりに/ bin/echo、dateの代わりに/ bin/date、hostnameの代わりに/ bin/hostnameを使用します。 (ymmv)Jimはcronで絶対的に正しいですが、同じインタラクティブユーザーとして常に正確な環境を使用するとは限りません。
コメントに従って、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
変数を設定することで実行できます。あなたのスクリプトの。
いくつかの便利なリンク:
私はあなたがいくつかの答えを得たが、明確な実用的な答えがないのを見ました。私にとってうまくいったのは、cronを次のように設定することでした。
*/5 * * * * /fullpath/cron.sh | (body = "$(cat)"; if [[-n $ body]]; then echo "$ body" | mail -s "Cron script output" [email protected]; fi)
これは出力をキャプチャし、それなしでメールに送信します。スクリプトで実行している場合でも、空の電子メールを受け取ります。 (colucixに感謝します)