2016-12-20 139 views
2

从macOS上的Java应用程序中,我使用Runtime.getRuntime().exec("open -Wn filename")启动带有Default应用程序的文件,我们称之为Viewing应用程序(例如AdobeReader for pdf)。这工作正常。从macOS上的open命令启动的应用程序进程获取pid

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

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

到目前为止,我无法设法让查看应用程序进程的PID能够杀死它。有了ps我只能找到它,当我有应用程序名称,但这正是我没有的,因为我想让操作系统决定有关查看应用程序。

没有任何人有一个想法,我怎么会

  • 获取从open命令启动的应用程序的PID,不知道应用程序名称或尿路感染(记得,open不是的父进程查看应用程序)?

  • 使启动程序的open过程的孩子,这样我就可以通过杀死open过程中杀死它?

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

您的想法非常感谢。

回答

0

我找到了解决方案从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(); 

不是很漂亮,但它的工作。