Aspetta che una certa applicazione sia uscita, quindi lancia un altro
Domanda
On OS X Voglio eseguire un comando di ossatura che attende fino a quando una certa applicazione specificata dal suo percorso .App completo è uscito, quindi avviare un'altra applicazione, ad es.usando /usr/bin/open -n /Applications/MyApp.app
.
Come raggiungere l'attesa fino a quando l'applicazione non è uscita?
Soluzione
Un approccio comune è quello di eseguire un loop di attesa, ad esempio con pgrep
:
while pgrep -f /Applications/TextEdit.app 2>/dev/null ; do sleep 1.0 ; done
.
Sfortunatamente, questo dormirà troppo e ritarderà l'inizio dell'altra applicazione.
In alternativa, se si sa che l'applicazione è in esecuzione, è possibile utilizzare /usr/bin/open
:
open -g -W /Applications/TextEdit.app
.
Sfortunatamente, questo aprirà l'applicazione se non è in esecuzione.È possibile controllare che sia in esecuzione prima di chiamare /usr/bin/open
, ma questo non sarebbe atomico: potrebbe essere la chiusura e il comando aperto potrebbe riavviarlo.
Entrambi possono essere incapsulati in ossext (anche se probabilmente non ha molto senso).
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"'
.
Come nota laterale: open -W
esegue effettivamente un kqueue Attendere (non polling Attendere) sul processo.Potrebbero esserci altri comandi che richiamano KQUEUE e eseguendo lo stesso compito senza rischiare di riavviare l'applicazione.È abbastanza facile implementare in c.