Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何销毁Java进程的子进程_Java_Linux_Shell - Fatal编程技术网

如何销毁Java进程的子进程

如何销毁Java进程的子进程,java,linux,shell,Java,Linux,Shell,我使用Runtime.getRuntime().exec执行基于OS管道的命令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

我使用
Runtime.getRuntime().exec
执行基于OS管道的命令
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程序中销毁其
子进程(pid:6957)

不要使用
Runtime.getRuntime().exec(…)
,使用2个
ProcessBuilder
s显式构建各个进程,并将它们的输入和输出连接在一起,以实现管道的等效性


然后,您将为每个进程创建一个单独的
进程
对象,并可以随意杀死它们。

不要使用
Runtime.getRuntime().exec(…)
,使用2
ProcessBuilder
显式构建各个进程,并将它们的输入和输出连接在一起,以实现管道的等效功能

然后,您将为每个对象处理一个单独的
对象,并可以随意杀死它们。

我找到了另一种方法:

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。

我找到了另一种方法:

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
,因为它为您抽象了特定于平台的细节。好吧,无论如何,某种解决方案,但在我看来,它可能会让我的代码闻起来很难闻。Thankstorry,这应该返回哪个进程的PID?在获得子进程的PID后,我如何销毁该进程?您需要执行特定于平台的操作,例如在linux上执行
kill
命令,在windows上执行
killtask
,等等。更需要使用
ProcessBuilder/process
,因为这为您抽象了特定于平台的细节。好吧,无论如何,某种解决方案,但在我看来,它可能会让我的代码闻起来很难闻。谢谢这是一个很好的建议,但是它可能会对流程的性能产生负面影响吗?性能应该是功能之后的一个考虑因素:如果您需要流程的PID,但您无法获得它,您的性能非常差,因为它没有做正确的事情。您的意思是没有办法获得流程的pid?如果您为每个流程创建了一个
流程
,你不需要知道实际进程的PID:你有
Process
实例,你可以调用
destroy
,这是一个很好的建议,但是它可能会对流程的性能产生负面影响吗?性能应该只在功能之后考虑:如果您需要流程的PID,但无法获得它,您的性能非常糟糕,因为它没有做正确的事情。您的意思是没有办法获得流程的pid?如果您为每个流程创建了一个
流程
,您就不需要知道实际流程的pid:您有可以调用
destroy
实例。