在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
进程来终止它吗?或
非常感谢您的想法。
答案 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();
不是很漂亮,但它可以胜任。