我使用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)
?
答案 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。