概要

Linux サーバーで PeerCastStation (ペカステ)を運用しているが、 たまに NullPointerException で落ちる。 手動で再起動するのは面倒だし、ダウンタイムが長くなるので自動化したいと思っていた。

そこで今回サーバー監視ツールの monit でプロセスの監視をする設定を行った。 また、その準備としてカスタムの init スクリプトを作成し、通常のサービスと同じように ペカステの起動・停止が行えるようにした。

旧来の構成

/etc/rc.local でサーバー起動時にペカステも起動されるのだが、ユーザー権限で動かしたいので

su plonk -c '/home/plonk/startup.sh'

としてユーザーホームディレクトリのスクリプトを実行するように設定していた。

startup.sh は PeerCastStation などのサーバープログラムを起動する。 関連する部分は以下の通り。

#!/bin/bash
cd ~/PeerCastStation-1.8.0
MONO_NO_SMP=1 nohup mono PeerCastStation.exe&

ペカステの zip は ~/PeerCastStation-1.8.0 に展開されており、 プログラムの出力(ログ)はこのディレクトリの nohup.out に追加される。

nohup(1) を利用しているのは、スクリプト自体の終了にペカステが道連れにされないためと、 .Net コンソールプログラム一般が端末に接続された状態でバックグラウンドで動作させられない為だ。 1

PeerCastStation のサービス化

/etc/init.d/peercaststation にカスタムの init スクリプトを作成した。

#!/bin/sh

### BEGIN INIT INFO
# Provides:          peercaststation
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: PeerCastStation
# Description:       PeerCastStation
### END INIT INFO

PIDFILE=/var/run/peercaststation.pid
USER=plonk
PEERCASTSTATION=/home/plonk/PeerCastStation-1.8.0/PeerCastStation.exe
LOGFILE=/home/plonk/PeerCastStation-1.8.0/nohup.out
MONO=mono

. /lib/lsb/init-functions

case "$1" in
    start)
        if pidofproc -p $PIDFILE $PEERCASTSTATION > /dev/null 2>&1 ; then
            exit 1
        fi
        su $USER -c "MONO_NO_SMP=1 exec nohup $MONO $PEERCASTSTATION >> $LOGFILE" &
        echo $! > $PIDFILE
        exit 0
        ;;
    stop)
        if [ -z $(pidofproc -p $PIDFILE $PEERCASTSTATION) ] ; then
            exit 1
        fi
        kill $(pidofproc -p $PIDFILE $PEERCASTSTATION)
        rm $PIDFILE
        exit 0
        ;;
    *)
        echo "Usage ${0##*/} {start|stop}" >&2
        exit 3
        ;;
esac
  
exit 0

これで service peercaststation start/stop でペカステの起動・停止が出来るようになり、 また、monit に監視させる為に必要な PID ファイルが作成されるようになった。 (不要な su のプロセスが残ってしまう点が気に入らないが、これを解決するためには 別のプログラムを書く必要があるだろう。)

# update-rc.d peercaststation defaults 98 02

とするとサーバー起動時に立ち上がるようになる。2

monit による監視

# apt-get install monit として monit をインストールしておく。 設定ファイルの /etc/monit/monitrc で変更した部分は、

set daemon 10

10秒置きに監視。

set alert plonk@***

メールで通知する。

set httpd port 2812 and 
   use address localhost
   allow localhost

http://localhost:2812/ でサーバーの状態が見られるようにする。 この設定が無いと monit status でコマンドラインから状態を表示することもできない。

そしてペカステ監視用の設定ファイルを include するようにした。

include /etc/monit/monitrc.d/peercaststation

/etc/monit/monitrc.d/peercaststation は以下の通り。

check process peercaststation
  with pidfile "/var/run/peercaststation.pid"
  start program "/etc/init.d/peercaststation start"
  stop program "/etc/init.d/peercaststation stop"

実際にペカステを kill すると以下のようなメールが届く。

Subject: monit alert --  Does not exist peercaststation

Does not exist Service peercaststation 

	Date:        Tue, 14 Jul 2015 08:15:22
	Action:      restart
	Host:        ***
	Description: process is not running

Your faithful employee,
Monit

10秒後に再起動された。

Subject: monit alert --  Exists peercaststation

Exists Service peercaststation 

	Date:        Tue, 14 Jul 2015 08:15:32
	Action:      alert
	Host:        ***
	Description: process is running with pid 3377

Your faithful employee,
Monit

以上。