如何使用jsvc将java程序转换为守护进程?

如何使用jsvc将java程序转换为守护进程?,java,daemon,jsvc,Java,Daemon,Jsvc,我写了一个程序,现在我要把它转换成一个守护进程。既然我是个书呆子,对它一无所知,你能告诉我怎么做吗?或者你能给我一些关于它的基本教程或阅读资料吗?我真的很想知道我怎么做 谢谢大家您100%确定需要使用jsvc吗?如果您只想让应用程序绑定到端口并在启动时运行,则不需要使用它。jsvc允许您的应用程序绑定到特权端口(查看文档。这里有一个如何在上实现守护程序接口的示例。一旦实现了守护程序,您应该能够通过以下Java类启动该进程: package example; import java.util.D

我写了一个程序,现在我要把它转换成一个守护进程。既然我是个书呆子,对它一无所知,你能告诉我怎么做吗?或者你能给我一些关于它的基本教程或阅读资料吗?我真的很想知道我怎么做


谢谢大家

您100%确定需要使用jsvc吗?如果您只想让应用程序绑定到端口并在启动时运行,则不需要使用它。jsvc允许您的应用程序绑定到特权端口(查看文档。这里有一个如何在上实现
守护程序接口的示例。一旦实现了
守护程序
,您应该能够通过以下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.");
    }

 }
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
其效果是:

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

事实上,我很确定,因为我被期望这样做。但我真的不知道如何做到这一点。JSVC还提供启动错误处理、PID跟踪和干净关机等功能。如果没有这些功能,让基于Java的应用程序作为Linux服务运行可能会很棘手。有setDaemon()在Thread类中。你在寻找它吗?如果你检查javadoc中的这个方法,你可以理解如何做。方法很好,但我有一个问题。如果有多个依赖jar文件,你如何定义类路径?我需要根据脚本逐个定义吗?@MMRUser:如果在中指定了依赖jar
你的.jar
清单,你没有。