Використання команди Terminal для вимкнення, перезавантаження та сну мого Mac?


120

Мене все більше цікавить використання терміналу як альтернативного способу вирішення рішень на моєму Mac. Я бачив це питання під назвою "Чи є кращий спосіб відключення / перезавантаження OSX?" .

Тому я хотів би знати:

Як вимкнути, перезапустити та заснути свій Mac, використовуючи виключно команду Terminal?


перезавантаження для перезавантаження також працює.
atilkan

Відповіді:


147

Команда, яку ви шукаєте, - це вимкнення . Це інформує всіх користувачів про те, що машина буде вимкнена, і всі програми закривають файли тощо.

Команда приймає параметр -h, -r або -s, щоб вимкнути, перезапустити або вимкнути Mac.

Команда повинна запускатися як root, тому вам потрібно використовувати sudo.

наприклад, негайно перезавантажити машину

sudo shutdown -r now

наприклад, щоб вимкнути машину за 60 хвилин

sudo shutdown -h +60

З коментарів можна вирішити дві речі

Принцип роботи відключення полягає у надсиланні сигналу всім процесам, які потім мають справу з цим, наприклад, зберегти відкриті файли тощо. Якщо вони не вийдуть, то їм пришлють SIGKILL, який змушує їх померти, не маючи шансу відповісти. Сигнали не надсилаються через звичайну чергу повідомлень ключових повідомлень, тому Apps повинен вирішувати це окремо до коду, який викликається з виходу з меню. Хороший додаток повинен викликати загальний код з обох.

Ця інша відповідь показує, як вимкнути функцію, як якщо б ви потрапили в параметри меню. Але зауважте, що програми можуть скасувати це відключення


2
Можливо, трохи не пов'язане з питанням і цією відповіддю, але для чого це варто, мені також стане в нагоді блокування мого Mac від терміналу, на зразок удару Winkey + L у Windows : /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend. У мене це псевдонім у файлі, який міститься у моєму .bash_profile таким чином:alias lock='/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend'
rubynorails

Невже це "говорить усім програмам закривати файли тощо"? Я думав, що це просто все вбило? Сторінка людини від 1998 року - BSD - чи оновила Apple команду добре спілкуватися з програмним забезпеченням macOS? Корисно, якщо все висіло, але якщо система працює добре, здається, що сказати процес входу в систему, щоб зробити вчинок було б "ввічливішим".
j-beda

@ j-beda Дивіться програму Apple doc developer.apple.com/legacy/library/documentation/Darwin/… - вона спочатку надсилає SIGTERM, з якими програмами слід працювати, перш ніж отримувати SIGKILL. Дивіться іншу відповідь, як це зробити через вікно для входу / графічного інтерфейсу. Насправді як вікно входу зробить діло?
користувач151019

Я майже впевнений, що "вимкнення" Unix не виконує все те, що робить звичайний процес відключення Mac GUI, таким чином, Apple не використовує його безпосередньо у власному програмному забезпеченні, але як мінімум робить деякі речі перед тим, як викликати це, є певний мінус, щоб викликати його безпосередньо. Я вважаю, що програма "loginwindow" доступна навіть у вікні входу в GUI, і її можна викликати через інструмент командного рядка "osascript". Однак це не є непогрішним, тому, можливо, доведеться все-таки викликати "відключення" (або надсилати окремі вбивства певним процесам, я думаю).
j-beda

Механізм сигналів не ставить повідомлення в чергу повідомлень програм як звичайне закриття, але додатки все одно повинні з цим справлятися. тобто, якщо вона не працює належним чином, це вина програми. за деяку спробу GUI дивіться іншу відповідь. Але я знаходжу, що часто існує додаток, який відмовляється померти і скасує процес виходу, тому вимкнення - єдиний гуранетичний спосіб
user151019

94

Вимкніть, не показуючи діалогове вікно підтвердження:

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

Вимкніть після відображення діалогового вікна підтвердження:

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

Перезапустіть, не показуючи діалогове вікно підтвердження:

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

Перезапустіть після відображення діалогового вікна підтвердження:

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

Вийдіть без показу діалогового вікна підтвердження:

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

Вийдіть після відображення діалогового вікна підтвердження:

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

Перейдіть спати ( pmset):

pmset sleepnow

Перейдіть до сну (AppleScript):

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

Перекладіть екрани в режим сну (10.9 і новіших версій):

pmset displaysleepnow

Чотири літерні коди подій Apple перераховані в AERegistry.h.

Усі команди Системні події вище надсилають події Apple у loginwindowпроцес. loginwindowпри виході, перезапуску, вимкненні або переведенні Mac у режим нормального сну надсилаються ті самі події Apple, що і вище. Див. Технічні питання QA1134: Програмно викликає перезапуск, відключення та / або вихід із системи .

Відповідно man shutdown, shutdown -h nowі shutdown -r nowвідправляє обробляє TERMсигнал, за яким йде KILLсигнал.

Відповідно до Посібника з програмування Daemons and Services , коли ви скажете loginwindowвийти, процеси, що підтримують раптове припинення, надсилаються KILLсигналом, а процеси, які не підтримують раптове припинення, припиняються по-різному: програми какао отримують applicationShouldTerminate:метод делегата, програми переднього плану отримують kAEQuitApplicationподії Apple, фонові програми отримують kAEQuitApplicationподію Apple, що супроводжується KILLсигналом, а демони отримують TERMсигнал, за яким KILLсигнал проходить через кілька секунд.


-4

Вимкнення негайно:

**sudo shutdown -h now**

Якщо ви відчуваєте, що ставите затримку на вимкнення, замість цього можете використати такий синтаксис команд:

**sudo shutdown -h +30**

(-h встановлений час для вимкнення, де (+) 30 хвилин для зупинки системи)


2
Інформація, представлена ​​у вашій відповіді, вже включена до прийнятої відповіді, і як такої немає необхідності повторювати те, що вже було сказано та прийнято.
користувач3439894

-11

також корисно, щоб вийти з ряду командного рядка терміналу, введіть 'exit':

[host:~user]$ exit

10
Яким чином це вимикає, перезапускає або вимикає Mac?
bmike

У будь-якому випадку я вважаю Ctrl-Dза краще вийти з системи, оскільки це не засмічує історію командного рядка.
mwfearnley
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.