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

从macOS上的open命令启动的应用程序进程获取pid,macos,command-line,java,process,Macos,Command Line,Java,Process,在macOS上的Java应用程序中,我使用Runtime.getRuntime().exec(“open-Wn filename”)启动一个带有默认应用程序的文件,让我们将其称为查看应用程序(例如AdobeReader for pdf)。那很好 当我想关闭查看应用程序(例如AdobeReader)时,我的问题就出现了 问题是,open命令本身是作为java应用程序的子进程启动的,但是open命令不是作为子进程启动查看应用程序,而是作为launchd(1)的子进程启动。因此,当我从Java应用程序

在macOS上的Java应用程序中,我使用
Runtime.getRuntime().exec(“open-Wn filename”)
启动一个带有默认应用程序的文件,让我们将其称为查看应用程序(例如AdobeReader for pdf)。那很好

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

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

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

有人知道我该怎么做吗

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

  • 使启动的应用程序成为
    open
    进程的子进程,这样我就可以通过终止
    open
    进程来终止它

  • 还有其他可能的解决办法吗

非常感谢您的想法。

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

lsof-t文件名

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

kill$(lsof-t文件名)

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

String killCommand = "kill $(lsof -t " + filename+ ")";
ProcessBuilder builder = new ProcessBuilder("bash", "-c", killCommand);
builder.start();
不是很漂亮,但它很管用