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)Możesz użyć iHook do uruchomienia haków logowania / wylogowania, które według mnie nadal działają dla nieinteraktywnych haków logowania i wylogowywania napisanych w Bash i Python na Yosemite.
http://rsug.itd.umich.edu/software/ihook/
źródło
Jeśli inni, którzy wchodzą tutaj z wyszukiwarek, nie dbają o użycie haka wylogowania, uruchom na przykład:
sudo defaults write com.apple.loginwindow LogoutHook '~/.logouthook';echo $'#!/usr/bin/env bash\n\nsay a'>~/.logouthook;chmod +x ~/.logouthook
Następnie
~/.logouthook
jest uruchamiany przy następnym wylogowaniu.Wartością
LogoutHook
klucza musi być ścieżka do pliku wykonywalnego, a nie polecenie powłoki. Wdefaults
modyfikuje polecenia/var/root/Library/Preferences/com.apple.loginwindow.plist
.źródło
launchd
, szkoda, że nie maRunBeforeUnload
lub podobna opcja .Nie mogę również uruchomić uruchomionego elementu wylogowania w wersji 10.10.1, ale klucz LogoutHook w „com.apple.loginwindow.plist” roota działa dobrze. Czy są jakieś inne przykłady uruchomionej metody?
W każdym razie napisałem AppleScript, aby zabić wolumin systemowy podczas wylogowywania, aby dźwięk dzwonka przy uruchamianiu nie był słyszalny przy następnym uruchomieniu. To, czego nie opracowałem, to szczegółowe informacje na temat zarządzania wieloma poleceniami wylogowania na podstawie jednego klucza LogoutHook lub tego, czy można przechowywać wiele kluczy LogoutHook, więc nadal interesuje mnie metoda Launchd, którą można zarządzać za pomocą Lingon, a nawet Lingon 3, który ma znacznie węższy zakres niż oryginał (prawdopodobnie w sklepie App Store).
źródło
sh
), więc musi to być plik wykonywalny, zauważę, że w mojej odpowiedzi.