Wygląda na to, że Apple nie jest zainteresowany wymianą haka wylogowania, ponieważ zamknęli mój problem, pytając o jeden.
Jednak jedną z ulepszeń w Yosemite jest to, że uruchomione teraz poprawnie wysyła sygnały do skryptów powłoki. Oznacza to, że możesz teraz wykonać takie zadanie wylogowania:
Oto przykładowy 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
To po prostu śpi (asynchronicznie, robienie tego synchronicznie bez ampersandu wydaje się nie działać), dopóki nie otrzyma jednego z uwięzionych sygnałów, w którym to momencie wykona onLogout
funkcję.
Wszystko, co musisz zrobić, to uruchomić ten skrypt za pomocą RunAtLoad
agenta uruchamiania lub demona uruchamiania i będzie on działał podczas wylogowywania lub zamykania systemu, choć należy pamiętać, że zadania mają ograniczoną ilość czasu, zanim zostaną zabite. , więc nie należy tego używać do uruchamiania czegokolwiek, co zajmuje dużo czasu lub wymaga połączenia sieciowego, które może zostać opóźnione itp.
Oczywiście nie przydaje się to nikomu na Mavericks lub wcześniej, ale w Yosemite wydaje się, że teraz działa zgodnie z oczekiwaniami; więc właściwie to robiłem dobrze, launchd
po prostu nie wysyłałem sygnałów poprawnie :)
UWAGA: Aby to zadziałało, wydaje się, że skrypty powłoki muszą być uruchamiane bezpośrednio po uruchomieniu, tzn. Nie powinny być wywoływane przez sh
. Jeśli więc zostałyby umieszczone w ~/Library/Scripts/foo.sh
twoim programie, argumenty mogłyby wyglądać następująco:
<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 ;'
(z grobem przed średnikiem)