次のPHPコマンドを実行するcronジョブがあります。
php /path/to/script.php > dev/null
STDERR出力のみMAILTOアドレスに送信する必要があります。私が知る限り、終了ステータスが1であっても、PHPスクリプトはSTDERR情報を出力しません。
phpコマンドの出力(STDOUT)を取得し、終了ステータスが0以外の場合にのみMAILTOに送信する方法は?
答え1
php /path/to/script.php > logfile || cat logfile; rm logfile
標準出力をダンプし、logfile
スクリプトが失敗した場合にのみ出力します(ゼロ以外の終了)。
注:スクリプトが次に出力される可能性がある場合stderr
stderr
次に、にリダイレクトする必要がありますstdout
。それ以外の場合は、終了コードがゼロであっても、に印刷された内容がある場合、stderr
cronは電子メールを送信します。
php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile
答え2
思ったことある?慢性病患者~からその他のユーティリティ。私はそれがあなたが望むものを正確に行うと思います。
Chronicはコマンドを実行し、コマンドが失敗した場合(ゼロ以外の終了または競合)にのみ標準出力と標準エラーを表示する準備をします。コマンドが成功すると、無関係な出力は非表示になります。
-e
最新バージョンには、stderrに書き込まれた内容があれば出力全体を表示するスイッチもあります。
答え3
終了ステータスがわかる前に出力が生成されるため、どこかに保存する必要があります。
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