Sembra che Apple non sia interessata alla sostituzione del gancio di disconnessione, poiché hanno chiuso il mio problema chiedendone uno.
Tuttavia, uno dei miglioramenti in Yosemite è che launchd ora invia correttamente i segnali agli script della shell. Ciò significa che ora puoi eseguire un'attività di disconnessione in questo modo:
Ecco un esempio logout.sh:
#!/bin/sh
onLogout() {
echo 'Logging out' >> ~/Logs/logout.sh.log
exit
}
trap 'onLogout' SIGINT SIGHUP SIGTERM
while true; do
sleep 86400 &
wait $!
done
Questo semplicemente dormirà (in modo asincrono, facendolo in modo sincrono senza la e commerciale non sembra funzionare) fino a quando non riceve uno dei segnali intrappolati, a quel punto eseguirà la onLogout
funzione.
Tutto quello che devi fare è avviare quello script usando un RunAtLoad
agente di lancio o un demone di avvio e verrà eseguito al log-out o allo spegnimento, anche se è importante tenere presente che le attività hanno solo un tempo limitato per essere completate prima di essere uccise invece , quindi questo non dovrebbe essere usato per eseguire tutto ciò che richiede molto tempo o richiede una connessione di rete che potrebbe essere ritardata ecc.
Naturalmente questo non è di alcuna utilità per nessuno su Mavericks o prima, ma sotto Yosemite ora sembra funzionare come previsto; quindi in realtà lo stavo facendo bene in primo luogo, launchd
ma non stavo inviando correttamente i segnali :)
NOTA: affinché funzioni gli script di shell sembra che debbano essere eseguiti direttamente dall'avvio, ovvero non dovrebbero essere invocati tramite sh
. Quindi, se fosse inserito nel ~/Library/Scripts/foo.sh
tuo programma gli argomenti potrebbero apparire come:
<key>ProgramArguments</key>
<array>
<string>~/Library/Scripts/foo.sh</string>
<string>bar</string>
</array>
<key>EnableGlobbing</key>
<true/>
line 8: syntax error near unexpected token ;'
(con una tomba prima del punto e virgola)