Uruchom skrypt przy wylogowaniu bez użycia haka wylogowania

11

Zastanawiałem się nad uruchomieniem kilku poleceń czyszczenia, gdy użytkownik się wylogowuje, jednak stara funkcja haka wylogowania, chociaż nadal działa, jest już przestarzała, więc może nie być z nami dłużej.

Niestety, mimo że launchdstanowi wygodną alternatywę dla haków logowania, nie ma tak oczywistego zamiennika dla haków wylogowania.

Już eksperymentowałem z tworzeniem skryptu powłoki, który jest uruchamiany przy logowaniu i po prostu śpi aż do odebrania sygnału zabicia, jednak wydaje się, że to nie działa (skrypt nigdy nie odbiera sygnału podczas normalnej pracy).

W przeciwnym razie nie jestem pewien, jaki byłby najlepszy sposób uruchomienia szybkiego polecenia po wylogowaniu? Wiem, że istnieją narzędzia innych firm, które mogą to zrobić, ale czy istnieje już „właściwy” sposób, aby to zrobić?

Haravikk
źródło

Odpowiedzi:

7

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 onLogoutfunkcję.

Wszystko, co musisz zrobić, to uruchomić ten skrypt za pomocą RunAtLoadagenta 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, launchdpo 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.shtwoim 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/>
Haravikk
źródło
Kiedy uruchamiam ten skrypt, zwraca line 8: syntax error near unexpected token ;'(z grobem przed średnikiem)
Jason
Ups, masz rację @Jason, myślę, że za bardzo go uprościłem, dostosowałem go tak, aby bardziej przypominał działający przykład.
Haravikk
Uruchamia się, gdy rozładuję go za pomocą launchctl, ale nie po wylogowaniu lub ponownym uruchomieniu. Dlaczego?
Trellis,
Czy istnieje sposób, aby go uruchomić, zanim nastąpi awaria sieci?
filippo
2

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
Niestety ten nadal używa normalnych haków do wylogowania pod maską.
0942v8653
0

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 ~/.logouthookjest uruchamiany przy następnym wylogowaniu.

Wartością LogoutHookklucza musi być ścieżka do pliku wykonywalnego, a nie polecenie powłoki. W defaultsmodyfikuje polecenia /var/root/Library/Preferences/com.apple.loginwindow.plist.

Lri
źródło
Dziękuję za podanie go jako alternatywy, ale obawiam się, że haki do logowania i wylogowywania zostały przestarzałe dla kilku ostatnich wersji OS X; chociaż spodziewam się, że nadal działają w Yosemite (ponieważ skupiają się głównie na zmianach interfejsu użytkownika i ciągłości), wygląda na to, że może pójść w dowolnym momencie, podobnie jak stare elementy startowe zastępowane przez launchd, szkoda, że ​​nie ma RunBeforeUnloadlub podobna opcja .
Haravikk
0

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).

ustaw wartość current_Vol na (wykonaj skrypt powłoki „osascript -e \” głośność wyjściową (pobierz ustawienia głośności) \ "")
jeśli przycisk zwrócił (wyświetlenie okna dialogowego „Czy chcesz wyciszyć dzwonek uruchamiania, przywrócić go, czy anulować?” Przyciski {„Wycisz”, „Przywróć”, „Anuluj”} Domyślny przycisk 1) to „wycisz”
    wykonaj skrypt powłoki "mkdir -p / usr / local / logouttask; echo '#! / bin / bash
# skrypt wylogowania
osascript -e \ "set volume 0 \" '> / usr / local / logouttask / logoutscript; sudo domyślnie zapisuje com.apple.loginwindow LogoutHook / usr / local / logouttask / logoutscript; chmod + x / usr / local / logouttask / logoutscript „z uprawnieniami administratora
jeszcze
    próbować
        wykonaj skrypt powłoki "domyślnie sudo napisz com.apple.loginwindow LogoutHook ''; rm / usr / local / logouttask / logoutscript" z uprawnieniami administratora
        wyświetl okno dialogowe „Gong uruchamiania zostanie usłyszany, jeśli ustawienie głośności jest większe niż 0 przy zamykaniu lub ponownym uruchomieniu.” przyciski {„OK”} domyślny przycisk 1
    w przypadku błędu numer komunikatu o błędzie numer_błędu
        jeśli numer_błędu wynosi 1, wówczas
            wyświetl okno dialogowe „Skrypt, który podczas wylogowywania ustawia głośność systemu na zero. Dźwięk uruchamiania zostanie usłyszany, jeśli ustawienie głośności będzie większe niż 0 przy zamykaniu lub ponownym uruchomieniu.” przyciski {„OK”} domyślny przycisk 1
        jeszcze
            wyświetla okno dialogowe „Błąd:” i numer_błędu i „.” oraz przyciski komunikatów o błędzie {„OK”} domyślny przycisk 1
        koniec jeśli
    zakończ próbę
koniec jeśli
Krata
źródło
Jak wywołujesz element wylogowania? Mój przykładowy skrypt powłoki musi być wywoływany bezpośrednio (bez użycia sh), więc musi to być plik wykonywalny, zauważę, że w mojej odpowiedzi.
Haravikk
Dziękujemy za aktualizację. Spróbuję jak najszybciej i dam znać.
Trellis
Mogę tylko wywołać zdarzenie zawarte w foo.sh, uruchamiając „launchctl unload” na liście odtwarzania, która wywołuje je w terminalu. Wylogowanie się nie uruchamia.
Trellis,