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

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

有帮助吗?

解决方案

一种常见的方法是执行等待循环,例如与 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中实现起来相当容易。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top