Używanie polecenia terminala do zamykania, ponownego uruchamiania i uśpienia mojego komputera Mac?

120

Coraz bardziej interesuje mnie korzystanie z terminalu jako alternatywnego sposobu rozwiązywania problemów na komputerze Mac. Widziałem to pytanie zatytułowane „Czy istnieje lepszy sposób na zamknięcie / ponowne uruchomienie OSX?” .

Chciałbym zatem wiedzieć:

Jak zamknąć, ponownie uruchomić i uśpić komputer Mac wyłącznie przy użyciu polecenia Terminal?

Szymon
źródło
ponowne uruchomienie w celu ponownego uruchomienia również działa.
atilkan

Odpowiedzi:

147

Polecenie, którego szukasz, zostało zamknięte . Informuje to wszystkich użytkowników, że urządzenie zostanie wyłączone, i nakazuje wszystkim aplikacjom zamknięcie plików itp.

Polecenie przyjmuje parametr -h, -r lub -s, aby zamknąć, ponownie uruchomić lub uśpić komputer Mac.

Polecenie musi być uruchomione jako root, więc musisz użyć sudo.

np. aby natychmiast ponownie uruchomić komputer

sudo shutdown -r now

np. aby wyłączyć maszynę w 60 minut

sudo shutdown -h +60

W komentarzach należy zwrócić uwagę na dwie rzeczy

Zamknięcie polega na wysłaniu sigterm do wszystkich procesów, które powinny sobie z tym poradzić, np. Zapisać otwarte pliki itp. Jeśli nie wyjdą, otrzymają SIGKILL, który zmusza ich do śmierci bez szansy na odpowiedź. Sygnały nie są wysyłane przez normalną kolejkę wiadomości z kluczem, więc aplikacje muszą sobie z tym poradzić osobno do kodu wywoływanego z wyjścia z menu. Dobra aplikacja powinna wywoływać wspólny kod z obu.

Ta druga odpowiedź pokazuje, jak zamknąć system, jakbyś nacisnął opcje menu. Pamiętaj jednak, że aplikacje mogą anulować to zamknięcie

użytkownik151019
źródło
2
Może nieco niezwiązane z pytaniem i tej odpowiedzi, ale za to, co warto w tym również przydaje mi się zablokować mój Mac od terminalu, tak jakby uderzenie Winkey + L w systemie Windows: /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend. Mam go w pliku, który pochodzi z mojego .bash_profile, w następujący sposób:alias lock='/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend'
rubynorails 13.01.2016
Czy to naprawdę „każe wszystkim aplikacjom zamykać pliki itp.”? Myślałem, że to wszystko zabiło? Strona podręcznika pochodzi z 1998 BSD - czy Apple zaktualizowało polecenie, aby ładnie mówić o oprogramowaniu macOS? Przydatne, jeśli wszystko się zawiesiło, ale jeśli system działa dobrze, wydaje się, że powiedzenie procesowi logowania do wykonania czynności byłoby bardziej „grzeczne”.
j-beda
@ j-beda Zobacz Apple doc developer.apple.com/legacy/library/documentation/Darwin/… - Najpierw wysyła SIGTERM, z którym aplikacje powinny sobie poradzić, zanim otrzymają SIGKILL. Zobacz inną odpowiedź dotyczącą robienia tego za pomocą okna logowania / GUI W rzeczywistości, jak zrobiłby to loginwindow?
user151019
Jestem całkiem pewien, że uniksowe „zamknięcie” nie wykonuje wszystkich czynności, które wykonuje zwykły proces zamykania interfejsu GUI dla komputerów Mac, a zatem do tego stopnia, że ​​Apple nie używa go bezpośrednio we własnym oprogramowaniu, ale przynajmniej robi pewne rzeczy przed wywołaniem istnieje jednak pewna wada wywoływania go bezpośrednio. Wierzę, że aplikacja „loginwindow” jest dostępna, nawet gdy nie ma jej w oknie logowania GUI, i można ją wywołać za pomocą narzędzia „osascript” z wiersza poleceń. Nie jest to jednak nieomylne, więc może być konieczne w każdym razie wywołanie „wyłączenia” (lub, jak sądzę, wysłanie poszczególnych zabójstw do określonych procesów).
j-beda
Mechanizm sygnałowy nie umieszcza komunikatu w kolejce wiadomości Apps tak, jak zwykle, ale aplikacje nadal powinny sobie z tym poradzić. tj. jeśli nie działa poprawnie, jest to wina aplikacji. dla niektórych prób GUI zobacz drugą odpowiedź. Ale okazuje się, że często istnieje aplikacja, która odmawia śmierci i anuluje proces rezygnacji, więc zamknięcie jest jedynym zabezpieczonym sposobem
użytkownik151019
94

Zamknij bez wyświetlania okna dialogowego potwierdzenia:

osascript -e 'tell app "System Events" to shut down'

Zamknij po wyświetleniu okna dialogowego potwierdzenia:

osascript -e 'tell app "loginwindow" to «event aevtrsdn»'

Uruchom ponownie bez wyświetlania okna dialogowego potwierdzenia:

osascript -e 'tell app "System Events" to restart'

Uruchom ponownie po wyświetleniu okna dialogowego potwierdzenia:

osascript -e 'tell app "loginwindow" to «event aevtrrst»'

Wyloguj się bez wyświetlania okna dialogowego potwierdzenia:

osascript -e 'tell app "System Events" to  «event aevtrlgo»'

Wyloguj się po wyświetleniu okna dialogowego potwierdzenia:

osascript -e 'tell app "System Events" to log out'

Idź spać ( pmset):

pmset sleepnow

Idź spać (AppleScript):

osascript -e 'tell app "System Events" to sleep'

Przełącz ekrany w tryb uśpienia (10.9 i nowsze):

pmset displaysleepnow

Cztery litery kodów zdarzeń Apple są wymienione w AERegistry.h.

Wszystkie powyższe polecenia Zdarzenia systemowe wysyłają zdarzenia Apple do loginwindowprocesu. loginwindowwysyłane są te same zdarzenia Apple, co powyżej, gdy wylogujesz się, uruchomisz ponownie, zamkniesz lub uśpisz komputer Mac. Patrz techniczne pytania i odpowiedzi QA1134: Programowo powodujące ponowne uruchomienie, zamknięcie i / lub wylogowanie .

Według man shutdown, shutdown -h nowi shutdown -r nowwysłać przetwarza TERMsygnał, po którym następuje KILLsygnał.

Zgodnie z Przewodnikiem programowania demonów i usług , gdy użytkownik loginwindowchce się wylogować, procesy obsługujące nagłe zakończenie są wysyłane KILLsygnał, a procesy, które nie obsługują nagłego zakończenia, są kończone na różne sposoby: aplikacje kakao otrzymują applicationShouldTerminate:metodę delegowania, aplikacje pierwszego planu odbiera kAEQuitApplicationzdarzenie Apple, aplikacje działające w tle odbierają kAEQuitApplicationzdarzenie Apple, a następnie KILLsygnał, a demony odbierają TERMsygnał, a następnie KILLsygnał po kilku sekundach.

Lri
źródło
-4

Wyłącz natychmiast:

**sudo shutdown -h now**

Jeśli masz ochotę opóźnić zamknięcie, możesz użyć następującej składni komend:

**sudo shutdown -h +30**

(-h parametr ustawia czas do zamknięcia, gdzie (+) 30 minut, aby zatrzymać system)

CamelTM
źródło
2
Informacje przedstawione w odpowiedzi są już zawarte w zaakceptowanej odpowiedzi i dlatego nie ma potrzeby powtarzania tego, co już wspomniano i zaakceptowano.
user3439894
-11

przydatne również, aby wylogować się z wiersza poleceń terminala, wpisz „exit”:

[host:~user]$ exit
holbein
źródło
10
W jaki sposób powoduje to wyłączenie, ponowne uruchomienie lub uśpienie komputera Mac?
bmike
Tak czy inaczej, wolę Ctrl-Dsię wylogować, ponieważ nie zaśmieca historii wiersza poleceń.
mwfearnley