How to convert a java program to daemon with jsvc?

前端 未结 3 1840
忘了有多久
忘了有多久 2020-11-29 17:42

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 pleas

相关标签:
3条回答
  • 2020-11-29 18:06

    Check out the Jakarta Commons Daemon documentation. There's an example of how to implement the Daemon interface on their wiki. Once you've implemented Daemon, you should be able to start the process by following the "Starting jsvc" and "Using jsvc" docs.

    0 讨论(0)
  • 2020-11-29 18:15

    Are you 100% sure you need to use jsvc? If you just want to have your application bind to a port and run at boot time, you don't need to use it. jsvc allows your application to bind to a privileged port (<1024) and then resume running as a normal user.

    0 讨论(0)
  • 2020-11-29 18:20

    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.
    
    0 讨论(0)
提交回复
热议问题