我有一个要在linux系统上守护的Java程序。换句话说,我要在外壳中开始运行,并在注销后继续运行。我还希望能够干净地停止该程序。
我发现这篇文章结合使用了外壳脚本和Java代码来达到目的。看起来不错,但我希望有一些简单的方法。
在Linux系统上守护Java程序的首选方法是什么?
我有一个要在linux系统上守护的Java程序。换句话说,我要在外壳中开始运行,并在注销后继续运行。我还希望能够干净地停止该程序。
我发现这篇文章结合使用了外壳脚本和Java代码来达到目的。看起来不错,但我希望有一些简单的方法。
在Linux系统上守护Java程序的首选方法是什么?
nohup java prog &
。
Answers:
Apache Commons Daemon将您的Java程序作为Linux守护程序或WinNT Service运行。
如果您不能依靠其他地方引用的Java Service Wrapper(例如,如果您在没有SW打包版本的Ubuntu上运行),则可能要采用老式的方法:让程序在/ var / run / $ progname.pid,并在其周围编写一个标准的SysV初始化脚本(例如,以ntpd为例)。最好也使其符合LSB。
本质上,启动函数会测试程序是否已在运行(通过测试/var/run/$progname.pid是否存在,以及该文件的内容是否为正在运行的进程的PID),以及是否未运行
logfile=/var/log/$progname.log
pidfile=/var/run/$progname.pid
nohup java -Dpidfile=$pidfile $jopts $mainClass </dev/null > $logfile 2>&1
停止功能检查/var/run/$progname.pid,测试该文件是否为正在运行的进程的PID,验证该文件是否为Java VM(以免杀死从死角简单地重用PID的进程Java守护程序的实例),然后终止该进程。
调用时,我的main()方法将通过将其PID写入System.getProperty(“ pidfile”)中定义的文件开始。
但是,一个主要障碍是:在Java中,没有简单而标准的方法来获取JVM运行所在的进程的PID。
这是我想出的:
private static String getPid() {
File proc_self = new File("/proc/self");
if(proc_self.exists()) try {
return proc_self.getCanonicalFile().getName();
}
catch(Exception e) {
/// Continue on fall-back
}
File bash = new File("/bin/bash");
if(bash.exists()) {
ProcessBuilder pb = new ProcessBuilder("/bin/bash","-c","echo $PPID");
try {
Process p = pb.start();
BufferedReader rd = new BufferedReader(new InputStreamReader(p.getInputStream()));
return rd.readLine();
}
catch(IOException e) {
return String.valueOf(Thread.currentThread().getId());
}
}
// This is a cop-out to return something when we don't have BASH
return String.valueOf(Thread.currentThread().getId());
}
我更喜欢nohup命令。博客文章说有更好的方法,但是我认为它们还不够好。
您可以尝试Java Service Wrapper,该社区版本是免费的并且可以满足您的需求。
那要看。如果这只是一次性的事情,我想守护它然后回家,但是通常我会等待结果,我可以这样做:
nohup java com.me.MyProgram &
在命令行中。要彻底清除它,您有很多选择。您可能具有SIGKILL的侦听器,或者侦听端口并在建立连接时关闭,并定期检查文件。不同的方法有不同的弱点。如果将其用于生产中,我会考虑得更多,并可能将一个脚本添加到/etc/init.d中以使其静音,并具有更复杂的关闭功能,例如tomcat所具有的功能。
DaemonTools:-在UNIX https://cr.yp.to/daemontools.html上管理服务的更干净的方法
从URL https://cr.yp.to/daemontools/install.html安装守护程序工具, 按照此处提到的说明进行操作,如有任何问题,请尝试使用说明https://gist.github.com/rizkyabdilah/8516303
在/etc/init/svscan.conf中创建一个文件,并添加以下几行。(仅cent-os-6.7必需)
start on runlevel [12345]
stop on runlevel [^12345]
respawn
exec /command/svscanboot
#!/bin/bash echo starting VM exec java -jar /root/learning-/daemon-java/vm.jar
注意:用您自己的Jar文件替换Jar。或任何Java类文件。
重新启动系统
svstat / service / vm应该已经启动并正在运行!
在这里看看:
http://jnicookbook.owsiak.org/recipe-no-022/
基于JNI的示例代码。在这种情况下,您将守护程序作为Java启动,并且主循环在C中执行。但是也可以将main,守护程序的服务循环放入Java。
https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo029
玩JNI!