从macOS上的open命令启动应用程序进程的pid

时间:2016-12-20 11:43:38

标签: macos command-line java process

在macOS上的Java应用程序中,我使用Runtime.getRuntime().exec("open -Wn filename")来启动带有Default应用程序的文件,让我们将其称为Viewing应用程序(例如Adobe Reader for pdf)。这很好。

当我想关闭查看应用程序(例如AdobeReader)时,我的问题就出现了。

问题是,open命令本身是作为java应用程序的子进程启动的,但是open命令不是作为子进程启动查看应用程序,而是作为launchd(1)的子进程启动。因此,当我从Java应用程序中销毁进程时,只会打开进程,而不是查看应用程序。

到目前为止,我无法获得查看应用程序进程的PID以便能够杀死它。使用ps我只能找到它,当我有应用程序名称时,但这正是我没有的,因为我想让os决定查看应用程序。

有没有人知道我怎么可能

  • 获取从open命令启动的应用程序的pid,而不知道应用程序Name或UTI(请记住,open不是查看应用程序的父进程)?

  • 使已启动的应用程序成为open进程的子进程,因此我可以通过终止open进程来终止它吗?

  • 任何其他可能的解决方案?

非常感谢您的想法。

1 个答案:

答案 0 :(得分:2)

我通过从lsof命令获取pid找到了解决方案,因为我知道文件名:

lsof -t filename

拥有pid,我可以终止进程,意味着查看应用程序:

kill $(lsof -t filename)

完整的解决方案如下所示:

String killCommand = "kill $(lsof -t " + filename+ ")";
ProcessBuilder builder = new ProcessBuilder("bash", "-c", killCommand);
builder.start();

不是很漂亮,但它可以胜任。