web-dev-qa-db-ja.com

cronテーブルmailxが空のコンテンツを引き起こしました

私は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
Daniel YC Lin

試すべきいくつかのこと。

  1. !/ bin/sh -xv

  2. 2 >>&1の2つの大なり記号を使用してstderrをリダイレクトしてみてください。

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で絶対的に正しいですが、同じインタラクティブユーザーとして常に正確な環境を使用するとは限りません。

2
IAmJeff

コメントに従って、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変数を設定することで実行できます。あなたのスクリプトの。

いくつかの便利なリンク:

1
jimm-cl

私はあなたがいくつかの答えを得たが、明確な実用的な答えがないのを見ました。私にとってうまくいったのは、cronを次のように設定することでした。

*/5 * * * * /fullpath/cron.sh | (body = "$(cat)"; if [[-n $ body]]; then echo "$ body" | mail -s "Cron script output" [email protected]; fi)

これは出力をキャプチャし、それなしでメールに送信します。スクリプトで実行している場合でも、空の電子メールを受け取ります。 (colucixに感謝します)

0
Jinxmcg