UbuntuでJavaアプリケーションをstart-stop-daemonを利用してデーモンにするには


Javaアプリをstart-stop-daemonを利用してデーモン化する際のメモです。

Ubuntuの起動スクリプトの書き方は Linux Standard Base Core Specification 4.1 の VIII. System Initialization に則って記述されます。

[bash]
#!/bin/sh

# path is `/etc/init.d/java-app’

### BEGIN INIT INFO
# Provides: java-app
# Default-Start: 2 3 4 5
# Default-Stop: 1
# Short-Description: Start java-app daemon
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

appdir=/home/hrendoh/
java=/usr
prog=java-app
pidfile=/var/run/${prog}.pid
logfile=/var/log/${prog}.log

daemon="${java}/bin/java"
args="-jar java-app.jar"

. /lib/lsb/init-functions

RETVAL=0

# System configuration
unset TMPDIR

start() {
echo -n "Starting ${prog} services: "
# cheking already run?
if start-stop-daemon –stop –quiet –signal 0 –pidfile $pidfile
then
pid=`cat ${pidfile}`
log_warning_msg "daemon is already running? (pid=${pid})"
exit 1
fi
start-stop-daemon –start –background –quiet –oknodo –pidfile $pidfile –make-pidfile –chdir ${appdir} –startas ${daemon} — ${args} >> ${logfile}
status=$?
log_end_msg $status
}
stop() {
log_daemon_msg -n $"Stopping ${prog} service: "
# cheking already run?
if start-stop-daemon –stop –quiet –signal 0 –pidfile $pidfile ; then
start-stop-daemon –stop –pidfile $pidfile
status=$?
rm -f $pidfile
log_end_msg $status
else
log_warning_msg "daemon not running? (check ${pidfile})."
fi
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Usage: ${prog} {start|stop|restart}: "
RETVAL=2
esac

exit $RETVAL
[/bash]

コメント

スクリプトの頭のコメントは、Ubuntuの場合は以下項目を記述します。

[bash]
# Provides: java-app
[/bash]

デーモンの名前を記述します。デーモンを「service java-app start」とやって起動するときに指定する名前を記述します。

[bash]
# Default-Start: 2 3 4 5
# Default-Stop: 1
[/bash]

システム起動時のランレベルを記述します。

[bash]
# Short-Description: Start java-app daemon
[/bash]

スクリプトの説明を記述します。

他の項目については以下のドキュメントを参照ください。
https://wiki.debian.org/LSBInitScripts

start

既に起動しているかチェック

[bash]
if start-stop-daemon –stop –quiet –signal 0 –pidfile $pidfile
[/bash]

–signal はkillのシグナルを指定します。
0を指定する場合はプロセスチェックのみを行うので、それをプロセスが既に起動しているかどうかのチェックに利用しています。
–quiet はコマンド実行メッセージを非表示にします。オプションなしの場合ここでは「No process in pidfile ‘/var/run/java-app.pid running; none killed.」というメッセージが表示されます。

起動

[bash]
start-stop-daemon –start –background –quiet –oknodo –pidfile $pidfile –make-pidfile –chdir ${appdir} –startas ${daemon} — ${args} >> ${logfile}
[/bash]

–background は、フォアグラウンドでしか起動できないプログラムに指定すると、バックグラウンドプロセスとして起動することができます。
–oknodo は、処理が何も行われなかった場合に、返り値に1ではなく0を返すようにするオプションです。
–pidfile 起動したプロセスのIDを保存します。
–make-pidfile –pidfileで指定したパスにまだファイルが無かった場合に新しく作成します。
–chdir に指定してディレクトリに移動してdaemonに指定したスクリプトを実行します。
–startas には実行するjavaを指定し、に続けてJavaの実行引数を指定しています。
標準出力は、logfileに指定したパスのファイルに出力します。

stop

停止を実行する必要があるかどうか、startの場合と同様のコマンドでチェック、返り値が0出ない場合は何もしない。

[bash]
if start-stop-daemon –stop –quiet –signal 0 –pidfile $pidfile

else
log_warning_msg "daemon not running? (check ${pidfile})."
fi
[/bash]

停止

[bash]
start-stop-daemon –stop –pidfile $pidfile
rm -f $pidfile
[/bash]

pidfileで指定されるプロセスを停止します。
start-stop-daemonコマンドはpidfileは停止後消さないので、正常終了した場合はpidfileを消します。

参考リンク

start-stop-daemon Manpage

起動スクリプトいろいろ
How to make a jar file run on startup & and when you log out?
One Java init script to rule them all
Running Java applications as daemon on Debian Linux
start-stop-daemon の簡単な使い方

http://upstart.ubuntu.com/cookbook/#run-a-java-application