2011年7月7日木曜日

Javaプログラム(jar)をLinux上でデーモン起動する

意外と半日ぐらいかけてしまったので、今後のためにメモ。
(無理やりねじ伏せたところがあるので要注意)

環境

OS: CentOS release 5.6 (Final)
デーモン起動させたいプログラム:SVF Connect [Server] (svf.jar)

詳細はウィングアークさんのページへ。製品知らないと見てもわからんと思うけど、要は Java製の常駐プログラムです。
適宜、ご自身で作成したものと読み替えてください。
※なんでデーモン起動用スクリプトが製品に付いてないのか(自作しなきゃいけないのか)、謎過ぎる。
(追記)インストール後のディレクトリ掘ったらいたわ…「SvfJavaConnectServer」。そういう大事なことはマニュアルかどっかに書いといてよ…半日潰したのに(涙)

基本方針

/etc/init.d にスクリプトを用意してランレベル別にリンクを設定(基本が大事かなってことで)

以下、内容。

設定ファイル


ファイル名: /etc/sysconfig/svfrserver
#
# SVF Connect [Server] Settings
#

#--------------------------------------------
# CLASSPATH(実行に必要なjar)
#--------------------------------------------
SVF_LIB=/opt/svfjp/svfjpd/lib
CLASSPATH=.:$SVF_LIB/svf.jar
CLASSPATH=$CLASSPATH:$SVF_LIB/vfpdfparser.jar
CLASSPATH=$CLASSPATH:$SVF_LIB/vfgrph.jar
CLASSPATH=$CLASSPATH:$SVF_LIB/jai_codec.jar
CLASSPATH=$CLASSPATH:$SVF_LIB/jai_core.jar
CLASSPATH=$CLASSPATH:$SVF_LIB/forme.jar
export CLASSPATH

#--------------------------------------------
# Java Boot Options(ここは結構苦し紛れ)
#--------------------------------------------
SVF_JAVA_OPTIONS=-Xrs
SVF_MINMEM=-Xms1024M
SVF_MAXMEM=-Xmx1024M

export SVF_JAVA_OPTIONS
export SVF_MINMEM
export SVF_MAXMEM

#--------------------------------------------
# SVF Connect [Server] Boot Options
#--------------------------------------------
FIT_PRODUCTS_BASE=/opt/svfjp
SVFLOGDIR=/var/log/svfrserver.log

SVF_OPTIONS="-L$SVFLOGDIR"

export SVF_OPTIONS


スクリプト


ファイル名: /etc/init.d/svfrserver

#!/bin/sh
#
# description: Starts and stops the SVF Connect for .NET Server daemon
#
# pidfile: /var/run/svfrserver.pid
# config:  /etc/svfrserver/svfrserver.conf

# Source function library.
if [ -f /etc/init.d/functions ] ; then
    . /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
    . /etc/rc.d/init.d/functions
else
    exit 1
fi

# Avoid using root's TMPDIR
unset TMPDIR

if [ -f /etc/sysconfig/svfrserver ]; then
   . /etc/sysconfig/svfrserver
fi

pidfilename=svfrserver
pidfile=/var/run/$pidfilename.pid
# 自作プログラムの時は以下で指定
bootclass=jp.co.fit.vfreport.SvfrServer
# コマンドラインで実行する内容
cmdline="java $SVF_JAVA_OPTIONS $SVF_MINMEM $SVF_MAXMEM $bootclass $SVF_OPTIONS"

RETVAL=0

start() {
    KIND="SvfrServer"
    echo -n $"Starting $KIND services: "
    daemon --pidfile=${pidfile} "$cmdline &"
    RETVAL=$?
    # pid
    pgrep -f "$cmdline" > $pidfile
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/svfrserver || RETVAL=1
    return $RETVAL
} 

stop() {
    KIND="SvfrServer"
    echo -n $"Shutting down $KIND services: "
    killproc -p $pidfile $pidfilename
    RETVAL=$?
    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/svfrserver
    echo
    return $RETVAL
} 

restart() {
    stop
    start
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart}"
        exit 2
esac

exit $?

ハマったのは、STOPするためにプロセスIDを記載したpidファイルを生成しないといけない箇所(startのとこ)。
自前で作ったJavaプログラムならプログラム内で自由にファイル生成できるけど、サードパーティのプログラムなんでプログラムからは生成できない。
というわけで、pgrepコマンドを利用しました。

# pgrep -f "コマンドライン文字列"

で、そのコマンドのプロセスIDが取得できるので、その内容をpidファイルとしてリダイレクト。
これでなんとかSTOPも出来るようになりました。

ランレベル別リンク設定

ランレベル0, 3, 5, 6にシンボリックリンクを作成。ランレベルの詳細はこちら
【例】ランレベル0の設定

# cd /etc/rc0.d
# ln -s ../init.d/svfrserver S16svfrserver


動作確認


# cd /etc/init.d
# ./svfrserver start
Starting SvfrServer services:      [OK]

大いに参考にさせていただいたサイト(多謝)

自作プログラムをサービスで起動・停止する方法 - とみんのブログ
PC覚え書き | プログラムのデーモン化
ランレベル

しかし、SVF。言いたいことが山ほどあるぞ。
ランタイムは良いのかもしれないけど、製品以外の部分(要はウ○ング○ークさん)はもう全然ダメ。
これがデファクトって、すごいよね。帳票部分ってよっぽど誰もやりたがらない分野なんだろうね。
まぁ、わかるけど。

0 件のコメント: