正常系のメッセージは標準出力に、異常系のメッセージは標準エラーに出すようになっているコマンドがあったとします。
これを cron に設定するときに、次のようにログおよびメール通知を行いたいです。
- 正常系のメッセージ(標準出力)
- ログファイルに出力
- 異常系のメッセージ(標準エラー)
- ログファイルに出力
- メールで通知
メール通知は標準出力または標準エラーにそのまま吐き出せば crond が勝手にやってくれます。
ログファイルへの出力は logger コマンドにパイプしておけば(syslog の設定によりますが) /var/log/messages にそれっぽい形式で書かれるのでオススメです。
$ echo "this is test" | logger -i -t hogehoge
$ sudo tail -1 /var/log/messages
May 29 20:02:39 ore-no-server hogehoge[20595]: this is test
が、この2つを前述のように共存させるのは結構面倒でした。
試行錯誤の結果次のようになりました。
(./hogehoge 2> >(tee /dev/stderr)) | logger -i -t hogehoge
>(command)
はプロセス置換と呼ばれるものです。
./hogehoge
の標準出力と、プロセス置換の中の tee
の標準出力をサブシェルでまとめて logger
にパイプしているのですが、正直これで大丈夫なのか不安です。
別の方法も教えてもらいました。
@ngyuki あ、すいません、勘違いしてました。もう解決したみたいですが、こんな感じでもできました。もう何が何やらですけど…。 (hogehoge 3>&2 2>&1 1>&3 | tee /dev/stderr ) 3>&2 2>&1 1>&3 | logger -t xxx
— とみたまさひろ (@tmtms) 2015, 5月 29
(./hogehoge 3>&2 2>&1 1>&3 | tee /dev/stderr ) 3>&2 2>&1 1>&3 | logger -i -t hogehoge
3>&2 2>&1 1>&3
は標準出力と標準エラーを入れ替えるパターンです。