web-dev-qa-db-fra.com

Comment convertir un programme Java en démon avec jsvc?

J'ai écrit un programme et maintenant je dois le convertir en démon. Puisque je suis un noob et que je ne sais rien à ce sujet, pouvez-vous s'il vous plaît me dire comment puis-je le faire ou pouvez-vous me donner des tutoriels de base ou des lectures à ce sujet? Je veux vraiment savoir comment je peux le faire?

Merci à tous

34
Ozer

Classe 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.");
    }

 }

Script de démarrage/arrêt du shell:

#!/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

Et l'effet:

$ ./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

Êtes-vous sûr à 100% que vous devez utiliser jsvc? Si vous souhaitez simplement que votre application soit liée à un port et exécutée au démarrage, vous n'avez pas besoin de l'utiliser. jsvc permet à votre application de se lier à un port privilégié (<1024) puis de reprendre son exécution en tant qu'utilisateur normal.

4
lynks

Consultez la documentation Jakarta Commons Daemon . Il y a un exemple de comment implémenter l'interface Daemon sur leur wiki . Une fois que vous avez implémenté Daemon, vous devriez pouvoir démarrer le processus en suivant les documents "Démarrage de jsvc" et "Utilisation de jsvc" .

3
jtoberon