题
在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中实现起来相当容易。
不隶属于 StackOverflow