Co to jest polecenie terminalu systemu Mac OS X do wylogowania bieżącego użytkownika?

19

Chciałbym uruchomić coś w stylu „sleep 3600; logout”, ale polecenie bash wylogowania zamyka tylko bieżący terminal. Jak zamknąć pełną sesję Mac OS X?

Grzegorz Adam Hankiewicz
źródło

Odpowiedzi:

22

Następujący skrypt Apple wyloguje bieżącego użytkownika:

tell application "System Events" to log out

Możesz zawinąć to w alias bash, używając osascriptpolecenia:

alias maclogout="osascript -e 'tell application \"System Events\" to log out'"

Jest to to samo, co kliknięcie „> Wyloguj się [nazwa użytkownika] ...” i wyloguje się po 2 minutach oczekiwania

Można to łatwo połączyć z sleeppoleceniem:

alias delayedlogout="sleep 3600; maclogout"

..lub można połączyć w jeden alias:

alias delayedlogout="sleep 3600; osascript -e 'tell application \"System Events\" to log out'"
dbr
źródło
Dobrze wyłożone. Ulepszeniem dokładnej odpowiedzi na pytanie byłoby uwzględnienie składni „uśpienia” w skrypcie jabłkowym. Rozumiem też, że drugi wiersz kodu został wklejony z terminala, dlatego niepotrzebnie uniknął podwójnych cudzysłowów wokół zdarzeń systemowych.
Sacrilicious
@ Sakrilicious dobra uwaga na temat polecenia snu. alias maclogout="..."
Wycofany
2
Niedawno odkryłem, że uruchomienie polecenia w terminalu nie spowoduje zamknięcia / zamknięcia systemu, ponieważ sam terminal zapobiega wylogowaniu z powodu bashu, który nie jest bieżącym procesem. Można to łatwo naprawić, wykonując polecenie „(sleep 1; polecenie)” i „”, w którym sen ustawia kolejkę zadania w tle, a zanim uruchomi terminal, nie uważa, że ​​jest zajęty.
Grzegorz Adam Hankiewicz
17

Nie ma „miłego” sposobu wylogowania bieżącego użytkownika z terminalu w OS X. „Nieuporządkowanym” sposobem na to jest zabicie loginwindowprocesu tego użytkownika . Nieuprzejmie zabije wszystkie procesy (programy) działające pod twoją nazwą użytkownika.

Jest to dwuetapowy proces.

  1. W terminalu uruchom to:

    ps -Ajc | grep loginwindow
    
  2. Następnie uruchomić

    sudo kill <pid>
    

    Gdzie <pid>jest pierwsza liczba (druga kolumna) z danych wyjściowych powyższego polecenia.

Użyj sudo kill -9, aby wymusić zabicie procesu, który musiałem zrobić, aby to zadziałało.

Na przykład, jeśli dane wyjściowe pierwszego polecenia to:

joshhunt    41     1    41 5e15c08    0 Ss     ??    3:13.09 loginwindow

Potem biegłbym sudo kill 41, wpisałem hasło, a następnie wylogowałem się.

Można to połączyć w alias Bash:

alias messylogout="ps -Ajc | grep loginwindow | grep -v grep | awk '{print \$2}' | sudo xargs kill"
Josh Hunt
źródło
Nie możesz po prostu użyć sudo killall loginwindow? Przynajmniej 10,7 loginwindowproces wydaje się być natychmiast ponownie otwarty.
Lri,
3

Wiem, że to stare pytanie, ale pomogło mi, polecenie, którego potrzebowałem w OS X 10.8:

ps -Ajc | grep loginwindow | awk '{print $2}' | sudo xargs kill -9

awkStwierdzenie jest inny i kill -9gwarantuje szybka logowania jest pokazane.

znak l
źródło
@gronostaj Czy naprawdę wierzysz, że taka edycja zostałaby zaakceptowana? Widzę sugerowane zmiany odrzucone jako „nieprawidłowa edycja (próba odpowiedzi na istniejący post lub komentowanie go)” lub „radykalna zmiana” przez cały czas - a Markl oczywiście nie ma jeszcze wystarczającej liczby powtórzeń, aby opublikować komentarze.
Scott
@Scott masz rację, zbyt szybko publikowałem ten komentarz.
gronostaj
2

Myślę, że znalazłem odpowiedź na to, jak z wdziękiem wylogować się z Mac OS X bez czekania 2 minut.

Zrozumiałem, że przytrzymanie Shift, Option i Command i naciśnięcie „q” wyloguje się z gracją i nie zapyta „czy chcesz się wylogować”.

Więc kodowałem AppleScript za pomocą Automatora, aby:

tell application "System Events"
     keystroke "q" using {command down, shift down, option down}
end tell
BITeC
źródło
0

Jeśli jesteś zalogowany do powłoki jako ten sam użytkownik, który jest zalogowany do GUI Maca, możesz wydać polecenie bez sudo: launchctl reboot logoutktóre dość skutecznie wylogowuje użytkownika; ma tę wadę, że nie zezwala aplikacjom, które wychodzą z monitowania o interakcję podczas zamykania, jednak nie wydaje się sugerować, że jest to to samo, co ich całkowite zabicie, jak mogłoby to zrobić kill(SIG TERM) lub kill -9(SIG KILL).

dlamblin
źródło
0

Twierdziłbym, że „najpiękniejszy” sposób może być po OS X 10.9 launchctl gui/$(id -u <username>) bootout

Dokumentację po OS X 10.9 dla launchctl można znaleźć po uruchomieniu launchctl help, ale zasadniczo powyższe polecenie spowoduje przerwanie tymczasowej sesji użytkownika. Alternatywą jest launchctl user/$(id -u <username>) bootoutzerwanie stałej sesji, która uruchamia demony użytkownika, gdy użytkownik nie jest zalogowany.

Można to przetestować, uruchamiając launchctl gui/$(id -u) bootout, spowoduje to natychmiastowe wylogowanie i spowoduje, że system wyświetli okno logowania (z pewnym opóźnieniem).

Iain Henderson
źródło
Przynajmniej w El Capitan poprawne polecenie to sudo launchctl bootout gui/XXXgdzie XXXjest numeryczny identyfikator użytkownika (UID). Zauważ, że i) bootoutkomenda jest pierwsza, a ii) $(id)zwraca znacznie więcej niż identyfikator UID.
Laryx Decidua
Zaktualizowano w celu poprawnego wywołania id (id -u)
Iain Henderson
0

Przyjemnym narzędziem do dodania do terminala jest komenda wylogowania , która może być używana jako:

logout UserName

Oto jak:

  1. Edytuj swój .bash_profile

    nano ~/.bash_profile

  2. Dodaj tę linię:

    logout() {sudo launchctl bootout user/$(id -u "$1")}

  3. Zapisz plik naciskając ctrl+x

  4. Uruchom ponownie terminal

Jesteś gotowy do drogi;)

Kappe
źródło