从macOS上的open命令启动的应用程序进程获取pid
在macOS上的Java应用程序中,我使用从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应用程序
Runtime.getRuntime().exec(“open-Wn filename”)
启动一个带有默认应用程序的文件,让我们将其称为查看应用程序(例如AdobeReader for pdf)。那很好
当我想关闭查看应用程序(例如AdobeReader)时,我的问题就出现了
问题是,open
命令本身是作为java应用程序的子进程启动的,但是open命令不是作为子进程启动查看应用程序,而是作为launchd(1)
的子进程启动。因此,当我从Java应用程序中销毁进程时,只有打开的进程被杀死,而不是查看应用程序
到目前为止,我无法获得查看应用程序进程的PID,以便能够终止它。使用ps
我只能在我有应用程序名称时找到它,但这正是我没有的,因为我想让操作系统决定查看应用程序
有人知道我该怎么做吗
- 获取从
命令启动的应用程序的pid,而不知道应用程序名称或UTI(请记住,open
不是查看应用程序的父进程)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();
不是很漂亮,但它很管用