【问题标题】:Getting the pid from application process launched from open command on macOS从 macOS 上的 open 命令启动的应用程序进程中获取 pid
【发布时间】:2016-12-20 11:43:38
【问题描述】:

在 macOS 上的 Java 应用程序中,我使用 Runtime.getRuntime().exec("open -Wn filename") 使用其默认应用程序启动文件,我们将其称为查看应用程序(例如 Adob​​eReader for pdf)。这很好用。

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

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

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

有人知道我该怎么做吗

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

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

  • 还有其他可能的解决方案吗?

非常感谢您的想法。

【问题讨论】:

    标签: macos command-line java process


    【解决方案1】:

    我通过从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();
    

    不是很漂亮,但确实可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      • 2014-03-09
      • 2023-03-18
      • 2013-02-07
      • 1970-01-01
      相关资源
      最近更新 更多