Espere hasta que se cierre una determinada aplicación y luego inicie otra
Pregunta
En OS X, quiero ejecutar un comando osascript que espere hasta que una determinada aplicación especificada por su ruta completa .app haya salido y luego inicie otra aplicación, por ejemplo.usando /usr/bin/open -n /Applications/MyApp.app
.
¿Cómo lograr la espera hasta que la aplicación haya salido?
Solución
Un enfoque común es realizar un bucle de espera, por ejemplo con pgrep
:
while pgrep -f /Applications/TextEdit.app 2>/dev/null ; do sleep 1.0 ; done
Desafortunadamente, esto dormirá demasiado y retrasará el inicio de la otra aplicación.
Alternativamente, si sabe que la aplicación se está ejecutando, puede usar /usr/bin/open
:
open -g -W /Applications/TextEdit.app
Desafortunadamente, esto abrirá la aplicación si no se estaba ejecutando.Puedes comprobar que está funcionando antes de llamar. /usr/bin/open
, pero esto no sería atómico:podría estar cerrándose y el comando de apertura podría reiniciarlo.
Ambos pueden encapsularse en osascript (aunque probablemente no tenga mucho sentido).
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"'
Como nota al margen: open -W
en realidad realiza una espera kqueue (espera sin sondeo) en el proceso.Es posible que haya otros comandos que invoquen kqueue y realicen la misma tarea sin correr el riesgo de reiniciar la aplicación.Es bastante fácil de implementar en C.