web-dev-qa-db-ja.com

Javaプログラムをjsvcでデーモンに変換するには?

私はプログラムを書いたが、今ではそれをデーモンに変換することが期待されている。私は初心者であり、それについて何も知らないので、どのように私はそれを行うことができるか教えてもらえますか、それについての基本的なチュートリアルや読書を教えてもらえますか?どうすればできるのか本当に学びたいですか?

皆さん、ありがとうございました

34
Ozer

Javaクラス:

package example;

import Java.util.Date;
import Java.util.Timer;
import Java.util.TimerTask;
import org.Apache.commons.daemon.*;

class EchoTask extends TimerTask {
    @Override
    public void run() {
        System.out.println(new Date() + " running ...");
    }
}

public class Main implements Daemon {

    private static Timer timer = null;

    public static void main(String[] args) {
        timer = new Timer();
        timer.schedule(new EchoTask(), 0, 1000);
    }

    @Override
    public void init(DaemonContext dc) throws DaemonInitException, Exception {
        System.out.println("initializing ...");
    }

    @Override
    public void start() throws Exception {
        System.out.println("starting ...");
        main(null);
    }

    @Override
    public void stop() throws Exception {
        System.out.println("stopping ...");
        if (timer != null) {
            timer.cancel();
        }
    }

    @Override
    public void destroy() {
        System.out.println("done.");
    }

 }

シェルの開始/停止スクリプト:

#!/bin/sh

# Setup variables
EXEC=/usr/bin/jsvc
Java_HOME=/usr/lib/jvm/Java-6-Sun
CLASS_PATH="/usr/share/Java/commons-daemon.jar":"/path/to/your.jar"
CLASS=example.Main
USER=foo
PID=/tmp/example.pid
LOG_OUT=/tmp/example.out
LOG_ERR=/tmp/example.err

do_exec()
{
    $EXEC -home "$Java_HOME" -cp $CLASS_PATH -user $USER -outfile $LOG_OUT -errfile $LOG_ERR -pidfile $PID $1 $CLASS
}

case "$1" in
    start)
        do_exec
            ;;
    stop)
        do_exec "-stop"
            ;;
    restart)
        if [ -f "$PID" ]; then
            do_exec "-stop"
            do_exec
        else
            echo "service not running, will do nothing"
            exit 1
        fi
            ;;
    *)
            echo "usage: daemon {start|stop|restart}" >&2
            exit 3
            ;;
esac

そしてその効果:

$ ./service start && sleep 5 && ./service stop
$ cat /tmp/example.out
initializing ...
starting ...
Fri Oct 07 16:26:54 EEST 2011 running ...
Fri Oct 07 16:26:55 EEST 2011 running ...
Fri Oct 07 16:26:56 EEST 2011 running ...
Fri Oct 07 16:26:57 EEST 2011 running ...
Fri Oct 07 16:26:58 EEST 2011 running ...
stopping ...
done.
68
barti_ddu

Jsvcを使用する必要があると100%確信していますか?アプリケーションをポートにバインドしてブート時に実行するだけの場合は、使用する必要はありません。 jsvcを使用すると、アプリケーションを特権ポート(<1024)にバインドし、通常のユーザーとして実行を再開できます。

4
lynks

Jakarta Commons Daemon のドキュメントをご覧ください。 their wikiDaemonインターフェースを実装する方法の例があります。 Daemonを実装したら、 "Starting jsvc" and "Using jsvc" docs に従ってプロセスを開始できるはずです。

3
jtoberon