終了ステータスに基づいてcronメールをMAILTOに出力します


11

次のようなphpコマンドを実行するcronジョブがあります。

php /path/to/script.php > dev/null

これにより、MAILTOアドレスにSTDERR出力のみが送信されます。私が収集したものから、PHPスクリプトは、終了ステータスが1であってもSTDERR情報を出力していません。

phpコマンド(STDOUT)の出力を取得して、終了ステータスがゼロ以外の場合にのみMAILTOに送信するにはどうすればよいですか?

回答:


12
php /path/to/script.php > logfile || cat logfile; rm logfile

これによりlogfile、標準出力がダンプされ、スクリプトが失敗した場合にのみ出力されます(ゼロ以外の値が出力されます)。

注:スクリプトもに出力するstderr場合は、にリダイレクトstderrする必要がありstdoutます。そうしstderrないと、終了コードが0であっても、何かが出力されると、cronは電子メールを送信します。

php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile

これはまた、stderrに表示されるすべてのものに対してキックアウトします。これは、必ずしもエラーがあることを意味しません(たとえば、デバッグ出力)。
hoffmanc 2014年

3

moreutilsからの慢性と考えました。私はそれがあなたが望むものを正確にすると思います:

chronicはコマンドを実行し、コマンドが失敗した(ゼロ以外の値を出力するかクラッシュする)場合にのみ、標準出力と標準エラーが表示されるように調整します。コマンドが成功した場合、無関係な出力は非表示になります。

最近のバージョンでは、-estderrに何かが書き込まれた場合、完全な出力も表示するスイッチがあります。


2

出力は終了ステータスがわかる前に生成されるため、どこかに保存する必要があります。

1つの可能性は、それをシェル変数に格納することです。

output=$(php /path/to/script.php)
if [ $? -ne 0 ]; then
  printf "%s\n" "$output"
fi

これはスクリプトの出力を完全に保存するわけではありません(後続の空白行を削除します)が、この使用例では問題ありません。末尾の空白行を保持したい場合:

output=$(php /path/to/script.php; ret=$?; echo a; exit $ret)
if [ $? -ne 0 ]; then
  printf "%s" "${output%a}"
fi

潜在的に大量の出力がある場合は、代わりに一時ファイルに保存することをお勧めします。

output_file=$(mktemp /var/tmp/script.XXXXXXXXXX.out)
php /path/to/script.php >>"$output_file"
ret=$?
if [ $ret -ne 0 ]; then
  echo "script.php failed (status $ret), see the output in $output_file"
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.