20
17

More than 5 years have passed since last update.

コマンドの標準出力と標準エラーを logger にパイプしつつ標準エラーはそのまま標準エラーに出す

Posted at

正常系のメッセージは標準出力に、異常系のメッセージは標準エラーに出すようになっているコマンドがあったとします。

これを 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 にパイプしているのですが、正直これで大丈夫なのか不安です。


別の方法も教えてもらいました。

(./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 は標準出力と標準エラーを入れ替えるパターンです。

20
17
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
17