エラーが起こった時にだけメール送信する cron とスクリプトの書きかた

標準エラーに出力する関数を作成すればいいのではないかと思って以下のような実装を書いてみました。シスログに記録する logger や組み込み変数 FUNCNAME を使うのはやりすぎかもしれません。(^_^; LOGとかの変数名はコーディングルールで決まっているのが前提です。

■crontab での設定

a b c d e /bar/foo.sh > /dev/null # 実行したいシェルスクリプト(標準出力は捨てる)

シェルスクリプトで使用する汎用ライブラリ(functions)での設定

msg ()
{
  echo "$@" > $LOG
}

errmsg ()
{
  date > /dev/stderr
  hostname > /dev/stderr
  echo "$@" > /dev/stderr
  logger "$@"
}

■実行したいシェルスクリプトでの正常/異常時の出力の切り替え

#!/bin/bash

. functions

MYSELF=`basename $0`
LOG=$MYSELF.log
EXIT_SUCCESS=0
EXIT_FAILURE=1

func_a ()
{
  command
  if [ $? -ne 0 ]; then
    errmsg "a error occured in $MYSELF: $FUNCNAME"
    # return some value or exit $EXIT_FAILURE
  fi
}

main ()
{
  func_a
  func_b
}

■参考情報
http://mylinux.g.hatena.ne.jp/teraco/20081208/1228696758