Hatena::Grouptwitterircgateway

yukogets が TIG ではうはう このページをアンテナに追加 RSSフィード

2010-01-31

id:yutamoty の TIG 介護スクリプトを FreeBSD に移植しました

| 18:46 |  id:yutamoty の TIG 介護スクリプトを FreeBSD に移植しました - yukogets が TIG ではうはう を含むブックマーク はてなブックマーク -  id:yutamoty の TIG 介護スクリプトを FreeBSD に移植しました - yukogets が TIG ではうはう  id:yutamoty の TIG 介護スクリプトを FreeBSD に移植しました - yukogets が TIG ではうはう のブックマークコメント

あらすじ

FreeBSDVMware 上での運用に切り替えたら、メモリが少なくなったせいか(512MB)TIG を動かしてる mono が前より頻繁に暴走してしまうようになりました。

そこで、d:id:yutamoty:20091207:1260179880シェルスクリプトFreeBSD に移植して、TIG の CPU 占有率が高まったりお亡くなりになったりした場合に自動的に生き返らせるようにしてみました。

スキルが無いので1つのスクリプトで両方で動くというかっこいいのに出来ませんでした。だれかおねがいします。

ソース

#!/usr/local/bin/bash

## パスの設定
MONO="/usr/local/bin/mono"
TIG="$HOME/bin/TwitterIrcGateway/TwitterIrcGatewayCLI.exe"
TIGOPTION="--bind-address=0.0.0.0 --port=16668 --encoding=UTF-8 --interval=60 --enable-replies-check=true --broadcast-update=true --broadcast-update-message-is-notice=true --set-topic-onstatuschanged=true --disable-userlist=true"
LOGDIR="$HOME/log"
LOG="$LOGDIR/tigps.log"

## 実行部
while true
do
# プロセスが落ちてたら再起動
   PID=`pgrep -f 'mono'`
   if [ -z $PID ]; then
      $MONO $TIG $TIGOPTION &
      time=`date "+%Y/%m/%d %H:%M"`
      echo "[$time] TIG is not running. Restarted." >> $LOG
      echo `uptime | awk -F"," '{print $4"," $5"," $6}'` >> $LOG
      sleep 60
   fi
# CPU 使用率が 90% 越えたら再起動
   TIGCPU=`top -b | grep mono | awk '{print $10}' | cut -d "." -f 1`
   if [ "90" -lt "$TIGCPU" ]; then
      kill -9 $PID
      sleep 3
      $MONO $TIG $TIGOPTION &
      time=`date "+%Y/%m/%d %H:%M"`
      echo "[$time] Detected overload. Restarted." >> $LOG
      echo "tigcpu $TIGCPU" >> $LOG
      echo `uptime | awk -F"," '{print $4"," $5"," $6}'` >> $LOG
      sleep 60
   fi
   sleep 3
done

ちょっと解説

FreeBSDmono を起動すると、プロセス名がこんな感じになってしまいます。

$ ps ax | grep mono
23432   0- S     72:39.52 [mono]

どういうことかというと、TwitterIrcGatewayCLI.exe が動いているにも関わらず、TwitterIrcGateway という文字列が出てこないのです。そこでしかたなく、pgrep で TIG のプロセスを探す際の文字列を 'mono' に変更しました。

当然、他に mono という文字列を含むプロセスが動いているとアウトなので何とかしたいのですが・・・。


あと、top の出力が LinuxFreeBSD では違います。

$ top -b | grep mono
23432 qlo         8  44    0   381M   297M ucond   72:47  0.98% mono

のように、CPU 負荷率の項目が左から 9 番目ではなく 10 番目になるので、これを抽出する部分を修正しています。


それから、死んでたにしろ暴走してたにしろ、TIG を再起動した後は 60 秒待つようにしてあります。うちの環境では TIG 起動直後に CPU 負荷が 90% を超えてしまうので、これが落ち着くまでウェイトを入れないとまた落とされてしまいます(´・ω・`)


他に、各種プログラムへのパスを変数で指定するようにしたり、(僕が)見やすくするために w | head -n 1 を uptime に置き換えたりしてあります。


そうそう、bash 自体が FreeBSD では /usr/local/bin/bashports とかから入れた場合)なので、1行目も修正してあります。

あとがき

とりあえずこれでちゃんと動いてるみたいですけど、daemontools とか使う方がスマートなのかなぁとか。暇があったら設定に挑戦みてみます。