🦆

cronで実行したタスクがコケたらSlackに通知する

2025/02/15に公開

はじめに

cronで回してるタスクがapt updateしたあと死んでたのに暫く気づかなかった。

そこで、タスクがコケたらSlackへ流すようにしました。

やりかた

  • Songmu/horensoを使ってタスクを実行するshell scriptを書く
    • horensoはタスクがコケると引数で指定したプロセスにエラー情報を渡して起動する
  • これにSlackに通知するreporterを指定してhorensoを起動する

それでは、やっていきましょう。

詳細

horensoいれる

cf. horensoというcronやコマンドラッパー用のツールを書いた | おそらくはそれさえも平凡な日々

binaryはreleasesにtargzがあって、よしなに選びます。わたしは/usr/local/binに置いた。

reporterを入れる

cf. horensoのSlack reporterを書いた - beatsync.net

ぐぐるといろんな実装がありますが、個人的好みでこれにしました。

なお、Pythonのエラーが起きたときのメッセージを送ったらinvalid_payloadになって通知失敗したので修正(他にもちょこっといじった)していて、こちらに置いてあります。

wrapper scriptを書く

cronwrap.sh
#!/bin/sh

export SLACK_ENDPOINT='https://hooks.slack.com/services/YOUR_WEBHOOK_URL'
export SLACK_USERNAME='cronwatcher'
export SLACK_ICON_EMOJI=':3guru:'
export SLACK_MUTE_ON_NORMAL=1

exec /usr/local/bin/horenso \
    -r /usr/local/bin/horenso_slack_reporter.pl \
    -- "$@"

crontabを書き換える

22 21 * * * /home/walkure/cronwrap.sh /your/job

結果

/bin/falseは特段のエラーメッセージを吐かないのでメッセージの部分がbackquoteだけになってますが、実際になにか起きるときはメッセージがあるはずなのでこれでよしとする。

補遺

万が一、通知先のworkspaceに:3oko:などがない場合はねずみのすきま — はかどる!ハッカドール3号くんのSlack用カスタム絵文字 を配布しますからどうぞ。

Discussion