我正在创建一个流程如下:
Process p = Runtime.getRuntime().exec("nohup /usr/bin/python " + filePath + " &");
Process q = Runtime.getRuntime().exec("/usr/bin/python -m -webbrowser " + url);
我正在尝试在后台运行p
,以便q
可以毫无问题地运行。此外,当Java程序结束时,python脚本不再运行。
答案 0 :(得分:1)
您运行的命令是nohup
,它立即退出。 nohup
启动了单独的Python流程,但这不是流程p
正在控制的。
如果这不是您想要的功能,为什么使用nohup
和&
?如果您只想执行Python子进程,只需调用:
Process p = Runtime.getRuntime().exec("/usr/bin/python " + filePath);
请注意,使用带有数组的exec
重载也更安全,因此您不必自己进行字符串连接(因此避免使用某种类型的安全漏洞)。语法略有改动:
Process p = Runtime.getRuntime().exec(new String[]{"/usr/bin/python", filePath});
Process p = new ProcessBuilder("/usr/bin/python", filePath).start();
答案 1 :(得分:0)
查看&
运算符here的文档。您的进程正在后台运行。对于您正在编写的Java程序(以及shell,就此问题而言),您所做的调用已经结束。它肯定仍然在后台运行,但你告诉shell(以及扩展你的Java程序)不要注意输出并继续前进。
答案 2 :(得分:0)
正如Sean Bright提到的那样,'&'正在运行的脚本末尾的字符。基本上在所有* nix系统上。如果你调用一个类型命令并使用&符号,它将在后台运行该进程。这就是为什么对java进程的调用返回完成的原因。
最好不要在后台执行命令(不是'&'),只是定期调用Process.isAlive()来确定进程是否完成。