如何破坏Java Process的子进程

时间:2015-10-09 08:38:19

标签: java linux shell

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

$ 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)

2 个答案:

答案 0 :(得分:0)

不要使用Runtime.getRuntime().exec(...),使用2 ProcessBuilder来明确构建各个流程,并将它们的输入和输出连接在一起,以完成相应的管道。

然后你会为每个人分别设置一个Process对象,并可以随意杀死它们。

答案 1 :(得分:0)

我发现了另一种方式:

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。