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 するようにしているので、ログイン項目に登録しておいたら、起動時に勝手に監視はじめてくれるので便利。
閾値の類は、適当に弄って好みにあわせればいいとおもいます。