javadaemonjsvc

How to convert a java program to daemon with jsvc?


I wrote a program and now I am expected to convert it to a daemon. Since I am a noob and dont know anything about it, can you please tell me how can I do it or can you please give me basic tutorials or readings about it ? I really want to learn how I can do it ?

Thank you all


Solution

  • Java class:

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

    Shell start/stop script:

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

    And the effect:

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