【问题标题】:How to destroy the subprocess of Java Process如何销毁Java Process的子进程
【发布时间】:2015-10-09 08:38:19
【问题描述】:

我使用Runtime.getRuntime().exec 来执行基于操作系统管道的命令tail -f filename | grep str。我设法实现了我的业务逻辑。但仍然有一个问题我必须解决: 使用管道时,进程会为另一个进程进行tail命令:

$ ps -ef | grep test.log
admin     6953 32721  0 16:32 ?        00:00:00 /bin/sh -c tail -f /home/admin    
/test.log | unbuffer -p grep '1444379575648'
admin     6957  6953  0 16:32 ?        00:00:00 tail -f /home/admin/test.log

Process.destroy() 方法只破坏自身(pid:6953)。如何在我的 Java 程序中破坏它的 subprocess(pid:6957)

【问题讨论】:

    标签: java linux shell


    【解决方案1】:

    不要使用Runtime.getRuntime().exec(...),使用 2 个ProcessBuilders 来显式构建各个流程,并将它们的输入和输出连接在一起以完成管道的等效操作。

    然后你将为每个单独的Process 对象,并且可以随意杀死它们。

    【讨论】:

    • 这是一个很好的建议,但它会对流程的性能产生负面影响吗?
    • 性能应该只是功能之后的考虑因素:如果您需要一个进程的 PID 而您无法获得它,那么您的性能就会非常糟糕,因为它没有做正确的事情。
    • 你的意思是没有办法获取进程的pid?
    • 如果您为每个进程创建了Process,则无需知道实际进程的PID:您拥有可以调用destroyProcess 实例。
    【解决方案2】:

    我找到了另一种方式:

    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;
    }
    

    这适用于 linux、win、mac。

    【讨论】:

    • 抱歉,这应该返回哪个进程的 PID?
    • 得到子进程的pid后,如何销毁进程?
    • 你需要做一些特定于平台的事情,比如在 Linux 上执行 kill 命令,在 Windows 上执行 killtask 等。更有理由使用 ProcessBuilder/Process,因为它抽象了为您提供特定于平台的详细信息。
    • 好吧,无论如何,有一种解决方案,但在我看来,它可能会让我的代码闻起来很糟糕。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2010-09-08
    • 2012-04-11
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 2014-10-01
    相关资源
    最近更新 更多