!/bin/sh -xv

!/bin/sh -xv

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

試してみることがいくつかあります。

  1. !/bin/sh -xv

  2. 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 に感謝)

関連情報