如何销毁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(…)
,使用2ProcessBuilder
显式构建各个进程,并将它们的输入和输出连接在一起,以实现管道的等效功能
然后,您将为每个对象处理一个单独的对象,并可以随意杀死它们。我找到了另一种方法:
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
的实例。