macos - 从 macOS 上的打开命令启动的应用程序进程获取 pid

标签 macos command-line java process

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

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

问题是,open 命令本身作为 java 应用程序的子进程启动,但 open 命令启动查看应用程序不是作为子进程,而是作为 启动(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();

不是很漂亮,但它完成了工作。

关于macos - 从 macOS 上的打开命令启动的应用程序进程获取 pid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41242971/

相关文章:

database - 重新启动 PostgreSQL 后,我所有的表都是空的(零行)

java - 使用来自 GNU/Linux 的 maven 为 Mac 用户捆绑 Java 程序

command-line - 如何在 Bitbucket 中通过命令行发送拉取请求?

java - 将字符串与文本进行匹配并存储下一个文本

java - 为什么 toString() 不能是静态方法?

c++ - 为跨平台应用程序创建许多 native GUI 前端

cocoa - 苹果/ cocoa : Embed a terminal window in my app

linux - cmd 2>&1 > 日志与 cmd > 日志 2>&1

networking - `net use` 启动脚本后网络驱动器进入炼狱

java - 我可以让 JUnit 更详细吗?