如何使用 jsvc 将 java 程序转换为守护进程?
Posted
技术标签:
【中文标题】如何使用 jsvc 将 java 程序转换为守护进程?【英文标题】:How to convert a java program to daemon with jsvc? 【发布时间】:2011-12-02 23:35:19 【问题描述】:我写了一个程序,现在我希望把它转换成一个守护进程。由于我是一个菜鸟并且对此一无所知,你能告诉我我该怎么做吗?或者你能给我一些基本的教程或阅读资料吗?我真的很想学习如何做到这一点?
谢谢大家
【问题讨论】:
线程类中有setDaemon()。你在找那个吗?如果你检查了这个方法的javadoc,你可以理解如何做。 【参考方案1】: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.
【讨论】:
不错的方法,但我有一个问题。如果有多个依赖的 jar 文件,如何定义类路径?我需要根据您的脚本分别定义吗? @MMRUser:如果在your.jar
清单中指定了依赖 jar,则不需要。【参考方案2】:
您是否 100% 确定需要使用 jsvc?如果您只想让应用程序绑定到端口并在启动时运行,则不需要使用它。 jsvc 允许您的应用程序绑定到特权端口 (
【讨论】:
其实我很确定,因为我应该这样做。但我真的不知道该怎么做 jsvc 还为您提供启动错误处理、PID 跟踪和干净关闭等功能。如果没有这些功能,要让基于 Java 的应用程序作为 Linux 服务运行可能会很棘手。【参考方案3】:查看Jakarta Commons Daemon 文档。有一个如何在their wiki 上实现Daemon
接口的示例。实现Daemon
后,您应该能够按照"Starting jsvc" and "Using jsvc" docs 开始该过程。
【讨论】:
以上是关于如何使用 jsvc 将 java 程序转换为守护进程?的主要内容,如果未能解决你的问题,请参考以下文章
与仅使用 systemd 相比,我从 JSVC 获得啥好处?