次のようなphpコマンドを実行するcronジョブがあります。
php /path/to/script.php > dev/null
これにより、MAILTOアドレスにSTDERR出力のみが送信されます。私が収集したものから、終了ステータスが1の場合でも、phpスクリプトはSTDERR情報を出力していません。
Phpコマンド(STDOUT)の出力を取得して、終了ステータスがゼロ以外の場合にのみMAILTOに送信するにはどうすればよいですか?
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
出力は終了ステータスがわかる前に生成されるため、どこかに保存する必要があります。
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