如何守护 Java 程序?
我有一个Java程序,我想在Linux系统上守护它。换句话说,我想开始在shell中运行它,并在我注销后让它继续运行。我也希望能够干净地停止程序。
我发现这篇文章使用shell脚本和Java代码的组合来做到这一点。它看起来不错,但如果可能的话,我想要一些更简单的东西。
在 Linux 系统上守护 Java 程序的首选方法是什么?
我有一个Java程序,我想在Linux系统上守护它。换句话说,我想开始在shell中运行它,并在我注销后让它继续运行。我也希望能够干净地停止程序。
我发现这篇文章使用shell脚本和Java代码的组合来做到这一点。它看起来不错,但如果可能的话,我想要一些更简单的东西。
在 Linux 系统上守护 Java 程序的首选方法是什么?
如果你不能依赖其他地方引用的Java Service Wrapper(例如,如果你在Ubuntu上运行,它没有SW的打包版本),你可能想用老式的方式去做:让你的程序用/var/run/$progname.pid编写PID,并编写一个标准的SysV init脚本(例如,使用ntpd的脚本作为示例, 这很简单)围绕它。最好也使其符合LSB标准。
实质上,start 函数测试程序是否已在运行(通过测试 /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
stop 函数检查 /var/run/$progname.pid,测试该文件是否是正在运行的进程的 PID,验证它是否是 Java VM(以免终止仅从 Java 守护程序的死实例中重用 PID 的进程),然后杀死该进程。
调用时,我的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());
}