Linuxなどで動かすデーモンプログラムを起動(start)・停止(stop)・再起動(restart)・状態確認(status)するための制御スクリプトを書いたのでメモしておく。
実装のポイント
- 一般的なプロセスIDファイルによるプロセス確認をしている。
- 停止時に3秒おきにシグナル0を送り、プロセスが終了するまで見届ける。
- statusでプロセスIDファイルだけ残ってプロセスが無いときはクラッシュの可能性が示す。
スクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| #!/bin/bash
prgfile=<Program Script filepath> pidfile=<PID filepath>
start() { if [ -f $pidfile ]; then pid=`cat $pidfile` kill -0 $pid >& /dev/null if [ $? -eq 0 ]; then echo "Daemon has started." return 1 fi fi
$prgfile
if [ $? -eq 0 ]; then echo "Daemon started." return 0 else echo "Failed to start daemon." return 1 fi }
stop() { if [ ! -f $pidfile ]; then echo "Daemon not started." return 1 fi
pid=`cat $pidfile` kill $pid >& /dev/null if [ $? -ne 0 ]; then echo "Operation not permitted." return 1 fi
echo -n "Stopping daemon..." while true do kill -0 $pid >& /dev/null if [ $? -ne 0 ]; then break fi
sleep 3 echo -n "." done
echo -e "\nDaemon stopped." return 0 }
status() { if [ -f $pidfile ]; then pid=`cat $pidfile` kill -0 $pid >& /dev/null if [ $? -eq 0 ]; then echo "Daemon running. (PID: ${pid})" return 0 else echo "Daemon might crash. (PID: ${pid} file remains)" return 1 fi else echo "Daemon not started." return 0 fi }
restart() { stop if [ $? -ne 0 ]; then return 1 fi
sleep 2
start return $? }
case "$1" in start | stop | status | restart) $1 ;; *) echo "Usage: $0 {start|stop|status|restart}" exit 2 esac
exit $?
|
- 実行プログラムのファイルパス
- プロセスIDファイルのパス
停止部分は実行プログラムの性質によって適宜変更すると良い。
Gistにも載せておいた。 https://gist.github.com/tilfin/5004848
tilfin
freelance software engineer