【问题标题】:Daemon java process - is there such a thing?守护进程java进程 - 有这样的事情吗?
【发布时间】:2016-06-25 12:18:37
【问题描述】:

我的 java 程序以下列方式创建一个进程:

ProcessBuilder builder = new ProcessBuilder("phantomjs.exe crawl.js");
Process proc = builder.start();

如果 java 程序突然终止(可能总是发生),phantomjs 进程(它不是 java 进程)可以保持活动状态并且没有办法终止它。

我希望 phantomjs 进程在封闭的 java 进程终止时终止(无论是否突然)。

有没有办法将Process 实例定义为“守护程序”对象,当其超级进程(即执行上述代码的 java 进程)终止时自动终止?

【问题讨论】:

  • 为什么不使用shutdown hooks
  • 当进程突然关闭时,关闭挂钩将无济于事
  • @GentiSaliu 我不认为 javascript 标签具有误导性。有人可能会想出一种方法来从 phantomjs 执行的 javascript 代码中做我需要的事情。
  • 您的问题含糊不清。 “如果java程序突然终止...... phantomjs进程......可以保持活动状态” - 和“有没有办法将Process实例定义为“守护进程”对象,在终止时终止其所有子进程? " - 是两个不同的问题。您希望进程 (phantomjs.exe) 在终止时终止 子进程,如您所问,还是希望在包含的 Java 进程终止时终止进程?
  • 对不起,如果我不够清楚。我希望 phantomjs.exe 进程在其“父”java 进程突然终止时终止。

标签: java phantomjs daemon


【解决方案1】:

API documentation 看起来很明确,没有限定词或黄鼠狼的措辞:

当没有更多对 Process 对象的引用时,子进程不会被杀死,而是子进程继续异步执行。

所以父母必须杀死它,当父母终止时它不会消失。

【讨论】:

  • 是的,我也阅读了文档。我想知道是否有任何框架或 3rd 方库可以包装 Process 对象并提供所需的功能。
  • @KidCrippler:是的,我知道这提供的价值有限。我想如果这不正确,并且有某种选择有人会击落它。
【解决方案2】:

不是一个很好的解决方案,但您总是可以定期从孩子那里检查父母的 PID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多