使用ProcessBuilder()销毁Java进程时出现问题

3

你好,我有一个在Java 8中运行外部进程的问题。基本上我需要从我的Java代码中运行ffplay,并且似乎如果外部进程有子进程,.destroy()方法将不起作用。

我的代码如下:

ProcessBuilder builder = new ProcessBuilder();
builder.command().add("/usr/bin/fplay");
builder.command().add(".........."); // my args
builder.environment().put("LD_LIBRARY_PATH", myCustomLibraryPath);
Process process = builder.start();

// After 
process.destroy();
process.destroyForcibly();

即使执行了destroy()和destroyForcibly()方法,ffplay窗口仍然保持打开状态。我尝试使用Runtime.getRuntime().exec(......)代替ProcessBuilder,这种情况下,destroy方法可以关闭ffplay窗口。但我不知道如何在Runtime中设置LD_LIBRARY_PATH。

有人能帮我用ProcessBuilder终止ffplay进程或在Runtime.getRuntime().exec(......)中设置LD_LIBRARY_PATH吗?


要在Runtime.exec中设置envvar(s),请使用其中一个重载函数来设置envp,例如但是它在底层使用了相同的Process实现,因此我怀疑销毁功能是否会更好。 - dave_thompson_085
@dave_thompson_085,奇怪的是我在帖子中描述的情况。似乎问题只出现在脚本中。 - Federico Massimi
是的,运行脚本可能会创建不同的进程树,与直接运行程序不同,这也使得杀死它非常不同,这取决于所使用的shell和脚本的细节。如果这是你的问题,也许你应该问一下。Stack不是一个讨论组或聊天室;你应该把问题——单数——放在问题里。 - dave_thompson_085
@Masso,你有没有找到解决这个问题的方法?我也遇到了完全相同的问题,我以为可能是我做错了什么。我的代码几乎和你的一模一样。 - William Seemann
2个回答

2
上周我遇到了一个问题,需要通过ProcessBuilder启动的批处理脚本无法停止。我的解决方案是:
Runtime.getRuntime().exec("taskkill /F /IM cmd.exe")

0
@dave_thompson_085 我注意到一个奇怪的事情,destroy不起作用的问题只出现在脚本中。让我更好地解释一下,如果我这样做:
ProcessBuilder builder = new ProcessBuilder();
builder.command().add("ffplay");
builder.command().add("/videos/TEST.mp4");
Process process = builder.start();

destroy() 方法关闭 ffplay 窗口。但是如果我创建一个名为 myScript.sh 的脚本,并在其中只包含这一行:

ffplay /videos/TEST.mp4

然后我执行:

ProcessBuilder builder = new ProcessBuilder();
builder.command().add("myScript.sh");
Process process = builder.start()

destroy() 方法无法关闭 ffplay 窗口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接