Ubuntu 14.04 で PeerCastStation のサービス化、および monit による監視設定メモ
概要
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
以上。