終了ステータスに応じてMAILTOにcronメールを出力する

終了ステータスに応じてMAILTOにcronメールを出力する

次の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スクリプトが失敗した場合にのみ出力します(ゼロ以外の終了)。

注:スクリプトが次に出力される可能性がある場合stderrstderr次に、にリダイレクトする必要がありますstdout。それ以外の場合は、終了コードがゼロであっても、に印刷された内容がある場合、stderrcronは電子メールを送信します。

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

関連情報