【问题标题】:Java: Kill all subprocesses on unixJava:杀死unix上的所有子进程
【发布时间】:2012-04-20 14:19:21
【问题描述】:

我有一个用 java 编写的应用程序,它在 Unix 上运行并在启动时启动两个子进程(通过Runtime.getRuntime().exec())。如果应用程序由于某种原因崩溃,子进程不会被杀死。

现在,我添加了一个关闭挂钩,它会在每次崩溃时触发,到目前为止还可以。但我想在 UNIX 控制台上为应用程序的每个子进程发送一个 SIGTERM 信号(或至少是 SIGINT)。我应该可以通过ps 找到他们的进程 ID,但我没有正确提取 PID 并为每个进程发送信号。

谁能帮忙?

非常感谢!

【问题讨论】:

  • 我不确定,但可以在 shell 脚本中执行您想要的操作,即通过提供 PID 来查找进程,然后在 shell 脚本本身中将其杀死。在 java 中调用这个脚本。
  • 如果您的应用程序具有特定名称,则 pkill 可以使用该名称。
  • 另一个存根可能在这里[1] blog.igorminar.com/2007/03/…
  • 应用程序没有特定的名称,进程只是命名为“java”。但是如果获取进程 ID,我怎样才能杀死所有子进程(然后在 shell 脚本中)?
  • 关闭挂钩在哪里运行?如果是在 Java 中,那么您是否尝试保存 Process 对象并在它们上调用 destroy

标签: java unix runtime sigterm


【解决方案1】:

我的意思不是官方功能,而是技巧。

这就是我为我的 java 应用程序获取进程 ID 的方式。我从来没有找到其他方法。

public static final String getPid() {
    try {
        RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean();
        String name = runtimeBean.getName();
        int k = name.indexOf('@');
        if (k > 0)
            return name.substring(0, k);
    } catch (Exception ex) {
    }
    return null;
}

这适用于 win、mac 和 linux。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2011-09-27
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多