phpとか

自分用備忘録なので、自分が分かる程度にしか書いてません。

サービス監視

立ち上がってないと困るサービスを監視して、落ちてたらslackで通知するscript作ってみました。


とりあえずコード

#!/bin/sh

#
# init
#

BODY=""
SERVICE_ARR=("mysqld" "httpd")


#
# get the status
#

getStatus(){
  SERVICE_NM=$1
  SERVICE_COMMAND="/etc/init.d/${SERVICE_NM} status"
  STATUS=`eval ${SERVICE_COMMAND}`
  EMPTY=`echo  ${STATUS} | grep -v "running"`

  if test "$EMPTY" != ""; then
    BODY="${BODY}${SERVICE_NM}が停止しています。\n"
  fi
}

#
# report
#
report(){
  CHANNEL="#チャンネル名"
  USER="存在しないユーザ名もOK"
  URL="自分のwebfook url"
  ICON=":warning:"
  if test "$BODY" = ""; then
    exit 1
  fi

  curl -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${USER}\", \"text\": \"${BODY}\", \"icon_emoji\": \"${ICON}\"}" ${URL}
}

for SERVICE_NM in "${SERVICE_ARR[@]}"
do
  getStatus $SERVICE_NM
done

report

【やってること】

1.監視するサービス設定

#
# init
#

BODY=""
SERVICE_ARR=("mysqld" "httpd")

2.監視サービスごとに、statusをチェック。

#
# get the status
#

getStatus(){
  SERVICE_NM=$1
  SERVICE_COMMAND="/etc/init.d/${SERVICE_NM} status"
  STATUS=`eval ${SERVICE_COMMAND}`
  EMPTY=`echo  ${STATUS} | grep -v "running"`

  if test "$EMPTY" != ""; then
    BODY="${BODY}${SERVICE_NM}が停止しています。\n"
  fi
}

「service」コマンドでなく、「/etc/init.d」を使用したのにはわけがありまして、下記ブログ様が参考になりました。
heartbeats.jp

サービスが動いているかの判定は、「running」文字列が含まれるかでみてます。

3.走っていないサービスがあれば通知

#
# report
#
report(){
  CHANNEL="#チャンネル名"
  USER="存在しないユーザ名もOK"
  URL="自分のwebfook url"
  ICON=":warning:"
  if test "$BODY" = ""; then
    exit 1
  fi

  curl -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${USER}\", \"text\": \"${BODY}\", \"icon_emoji\": \"${ICON}\"}" ${URL}
}

slackでの通知に関して、下記の記事でもう少しだけ詳しく書いたので、ご覧ください。
starfam.hatenablog.com

あとは、cronに登録