首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何守护Java程序?

如何守护Java程序?
EN

Stack Overflow用户
提问于 2009-02-10 22:58:43
回答 9查看 101.6K关注 0票数 75

我有一个Java程序,我想在linux系统上对其进行守护进程。换句话说,我希望开始在shell中运行它,并在我注销后让它继续运行。我也希望能够干净利落地停止这个程序。

我发现了this article,它结合使用了shell脚本和Java代码来完成这项工作。它看起来不错,但如果可能的话,我想要简单一点的。

在Linux系统上对Java程序进行守护的首选方法是什么?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-02-10 23:04:18

Apache Commons Daemon将以Linux守护进程或WinNT服务的形式运行您的Java程序。

票数 37
EN

Stack Overflow用户

发布于 2009-02-10 23:35:24

如果你不能依赖Java Service Wrapper引用的elsewhere (例如,如果你运行的是Ubuntu,它没有SW的打包版本),你可能想要用老式的方法:让你的程序在/var/run/$程序名.pid中编写它的PID,然后围绕它写一个标准的SysV初始化脚本(以ntpd为例,它很简单)。最好也让它符合LSB。

本质上,start函数测试程序是否已经在运行(通过测试/var/ run /$procname.pid是否存在,并且该文件的内容是正在运行的进程的PID ),如果没有运行

代码语言:javascript
复制
logfile=/var/log/$progname.log
pidfile=/var/run/$progname.pid
nohup java -Dpidfile=$pidfile $jopts $mainClass </dev/null > $logfile 2>&1

stop函数检查/var/run/$procname.pid,测试该文件是否是正在运行的进程的PID,验证它是否是Java VM (这样就不会杀死一个简单地重用了我的Java守护进程实例中的PID的进程),然后杀死那个进程。

当被调用时,我的main()方法将首先在System.getProperty("pidfile")中定义的文件中写入它的PID。

然而,一个主要的障碍是:在Java中,没有简单和标准的方法来获取运行JVM的进程的PID。

下面是我的想法:

代码语言:javascript
复制
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());
}
票数 32
EN

Stack Overflow用户

发布于 2009-02-10 23:10:43

我更喜欢nohup命令。这篇博文说还有更好的方法,但我不认为它们足够好。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/534648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档