はじめに
Rails でメール送信等を sidekiq のキューに入れて処理させていたが、sidekiq が落ちてしまって、
メール送信が行われなくなってしまうことが、たびたびあったので、監視の必要性が出てきた。
監視で引っかかった際の通知の方法としては、メールはあんまり見ないので、どうせならいつも開いていて、
プッシュ通知も来る Slack に投稿してやろう思い、プロセスを監視して、Slack に通知するシェルスクリプトを書いてみた。
使用方法は、サーバーにシェルスクリプトを設置し、crontab に下記のよう追加する。
今回は、sidekiq を監視したいので、引数は sidekiq。
crontab
*/1 * * * * cd /home/yutackall/work && ./process_watch.sh sidekiq
色々雑だけど、暫定対応としては動いてくれるので、いいのかなと。
サンプルソース
process_watch.sh
#!/bin/sh
# Incoming WebHooks URL
WEBHOOKURL="https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
# slack channel
CHANNEL="#general"
# user name for direct message
USER="@yutackall"
# slack user name
BOTNAME="process_watch_bot"
# slack icon
FACEICON=":ghost:"
if [ $# -ne 1 ]; then
echo "Usage: $0 process_name" 1>&2
exit 1
fi
PROCESS_NAME=$1
MESSAGE="Process Not Found!! process_name: ${PROCESS_NAME}"
COUNT=`ps -ef | grep ${PROCESS_NAME} | grep -v grep | grep -v $0 | wc -l`
if [ ${COUNT} = 0 ]; then
# channel へ通知
curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"icon_emoji\": \"${FACEICON}\", \"text\": \"${MESSAGE}\" }" ${WEBHOOKURL} >/dev/null
# 自分へもダイレクトメッセージを送信
curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${USER}\", \"username\": \"${BOTNAME}\", \"icon_emoji\": \"${FACEICON}\", \"text\": \"${MESSAGE}\" }" ${WEBHOOKURL} >/dev/null
fi
channel や、user 等を引数から取ることも考えたけど、最低限で十分だと判断した。
Slack の設定
Slack には Incoming Webhooks という、外部から Slack で発行した URL に POST すれば、
そのまま channel や user への direct message が送信できる機能があるので、それを利用した。
Incoming Webhooks の設定は下記記事を参考にした。