等到某个应用程序退出,然后再启动另一个应用程序

Tho*_* S. 1 macos osascript

在 OS XI 上,想要执行 osascript 命令,该命令会等待由其完整 .app 路径指定的某个应用程序退出,然后启动另一个应用程序,例如使用/usr/bin/open -n /Applications/MyApp.app.

如何实现等待直到应用程序退出?

Pau*_*yot 6

一种常见的方法是执行等待循环,例如pgrep

while pgrep -f /Applications/TextEdit.app 2>/dev/null ; do sleep 1.0 ; done
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会睡眠过多并延迟其他应用程序的启动。

或者,如果您知道应用程序正在运行,您可以使用/usr/bin/open

open -g -W /Applications/TextEdit.app
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果它没有运行,这将打开应用程序。您可以在调用之前检查它是否正在运行/usr/bin/open,但这不是原子性的:它可能正在关闭,而 open 命令可能会重新启动它。

两者都可以封装在 osascript 中(尽管它可能没有多大意义)。

osascript -e 'do shell script "while pgrep -f /Applications/TextEdit.app 2>/dev/null ; do sleep 1.0 ; done"'
osascript -e 'do shell script "open -g -W /Applications/TextEdit.app"'
Run Code Online (Sandbox Code Playgroud)

作为旁注:open -W实际上对进程执行 kqueue 等待(非轮询等待)。可能还有其他命令调用 kqueue 并执行相同的任务,而不会冒重新启动应用程序的风险。在 C 中实现非常容易。

  • +1 – 我不知道“open -W”。看起来“open -W /App1.app && open /App2.app”将是解决OP潜在问题的一个非常巧妙的解决方案。 (2认同)