Подождите, пока не выйдет определенное приложение, затем запустите другое
В OS X я хочу выполнить команду osascript, которая ожидает, пока не выйдет определенное приложение, указанное в его полном пути.app, а затем запустить другое приложение, например, используя /usr/bin/open -n /Applications/MyApp.app
,
Как добиться ожидания, пока приложение не выйдет?
1 ответ
Общий подход заключается в выполнении цикла ожидания, например, с 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.