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

时间:2014-06-03 15:18:13

标签: macos osascript

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

如何在应用程序退出之前实现等待?

1 个答案:

答案 0 :(得分:3)

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

while pgrep -f /Applications/TextEdit.app 2>/dev/null ; do sleep 1.0 ; done

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

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

open -g -W /Applications/TextEdit.app

不幸的是,如果应用程序没有运行,这将打开它。您可以在调用/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"'

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