Adium の負荷状況を見て再起動する Bash Script
Adium で Twitter などのサービスを IM で受け続けていると、やがて CPU 食いまくって kill しない限り固まる現象が頻発する。
これがウザいなあとおもったので簡単な Shell Script 書いてみた。
なんちゃって daemon がこんな感じ。ファイル名は supervisediumd にした。
1秒間隔で監視して CPU 使用率 75% 超えた状態が、10回続けば再起動する。
#!/bin/sh # settings COUNT_LIMIT=10 CPU_LIMIT=750 APP="/Applications/Adium.app" PIDFILE=$1 if [ -f $PIDFILE ] ; then echo "supervisediumd is already running" exit 0 fi trap "rm -rf $PIDFILE; echo 'stopped supervisediumd'" EXIT echo $$ > $PIDFILE echo "start supervising adium" COUNT=0 while [ 1 ] ; do PSINFO=`ps ux | grep $APP | grep -v grep` if [ -z "$PSINFO" ] ; then open -a $APP fi PID=`echo $PSINFO | awk '{print $2}'` CPU=`echo $PSINFO | awk '{print $3 * 10}'` if [ $CPU -gt $CPU_LIMIT ] ; then COUNT=`expr $COUNT + 1` if [ $COUNT -gt $COUNT_LIMIT ] ; then kill $PID open -a $APP COUNT=0 fi else COUNT=0 fi sleep 1 done
操作用のコマンドはこんな感じ。ファイル名は supervisedium にしてる。
#!/bin/sh PIDFILE="/tmp/supervisediumd.`whoami`" COMMAND="supervisediumd" case $1 in "clean" ) echo "cleaning pidfile: $PIDFILE" rm -rf $PIDFILE ;; "start" | "" ) if [ -f $PIDFILE ] ; then echo "supervisediumd is already running" exit 0 else $COMMAND $PIDFILE & echo "starting supervisediumd $!" fi ;; "stop" | "shutdown" ) echo "stopping supervisediumd..." if [ -f $PIDFILE ] ; then kill `cat $PIDFILE` fi ;; "restart" ) echo "restarting supervisediumd..." if [ -f $PIDFILE ] ; then kill `cat $PIDFILE` fi while [ -f $PIDFILE ] ; do sleep 1 done $COMMAND $PIDFILE & ;; * ) cat <<_EOT_ usage: $0 [start|stop|shutdown|clean|restart] start : start supervisediumd stop, shutdown : shutdown supervisediumd clean : cleaning pidfile restart : restart supervisediumd _EOT_ ;; esac
で、両方 PATH 通ってるところに置いて、 supervisedium start すれば OK 。
引数無しの場合は start するようにしているので、ログイン項目に登録しておいたら、起動時に勝手に監視はじめてくれるので便利。
閾値の類は、適当に弄って好みにあわせればいいとおもいます。