Подождите, пока не выйдет определенное приложение, затем запустите другое

В 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.

Другие вопросы по тегам