Использование команды терминала для выключения, перезагрузки и сна моего Mac?

120

Меня больше интересует использование терминала в качестве альтернативного способа решения проблем на моем Mac. Я видел этот вопрос под названием «Есть ли лучший способ выключить / перезапустить OSX?» ,

Поэтому я хотел бы знать:

Как выключить, перезагрузить и перевести мой Mac с помощью исключительно команды терминала?

Саймон
источник
перезагрузка для перезагрузки тоже работает.
atilkan

Ответы:

147

Команда, которую вы ищете, выключается . Это информирует всех пользователей о том, что машина будет выключена, и сообщает всем приложениям о необходимости закрытия файлов и т. Д.

Команда принимает параметр -h, -r или -s для выключения, перезагрузки или отключения компьютера Mac.

Команда должна быть запущена от имени пользователя root, поэтому вам нужно использовать sudo.

например, перезагрузить машину немедленно

sudo shutdown -r now

например, чтобы выключить машину через 60 минут

sudo shutdown -h +60

Из комментариев есть две вещи для решения

Как работает завершение работы, отправляя сигтерм всем процессам, которые затем должны иметь дело с этим, например, сохранять открытые файлы и т. Д. Если они не выходят, то им отправляется сигнал SIGKILL, который вынуждает их умереть без возможности ответить. Сигналы не отправляются через обычную ключевую очередь сообщений, поэтому приложения должны иметь дело с этим отдельно от кода, который вызывается при выходе из меню. Хорошее приложение должно вызывать общий код из обоих.

Этот другой ответ показывает, как завершить работу, как если бы вы нажали пункты меню. Но обратите внимание, что приложения могут отменить это завершение работы

user151019
источник
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
Действительно ли он "говорит всем приложениям закрывать файлы и т. Д."? Я думал, что это просто убило все? Страница справочника BSD 1998 года - обновила ли Apple команду для общения с программным обеспечением macOS? Полезно, если что-то зависло, но если система работает хорошо, кажется, что указание процессу loginwindow выполнить действие было бы более «вежливым».
J-Beda
@ j-beda См. Apple doc developer.apple.com/legacy/library/documentation/Darwin/… - Сначала он отправляет SIGTERM, с какими приложениями следует иметь дело, прежде чем они получат SIGKILL. Посмотрите другой ответ, чтобы сделать это через окно входа в систему / графический интерфейс. На самом деле, как бы окно входа в систему сделало бы это?
user151019
Я вполне уверен, что «выключение» Unix не делает всего, что делает обычный процесс выключения Mac GUI, таким образом, до такой степени, что Apple не использует его непосредственно в своем программном обеспечении, но как минимум делает некоторые вещи перед вызовом это, есть некоторые недостатки, чтобы вызвать его напрямую. Я считаю, что приложение «loginwindow» доступно, даже если оно не находится в окне входа в GUI, и может быть вызвано с помощью инструмента командной строки «osascript». Однако это не является непогрешимым, так что может потребоваться в любом случае вызвать «выключение» (или, я полагаю, отправить отдельные убийства определенным процессам).
Дж-Беда
Механизм сигналов не помещает сообщение в очередь сообщений приложений, как это делает обычное закрытие, но приложения все равно должны с ним справляться. то есть, если он не работает должным образом, то это вина приложений. для некоторой попытки GUI см. другой ответ. Но я обнаружил, что часто есть приложение, которое отказывается умирать и отменяет процесс выхода, поэтому отключение является единственным гарантированным способом
user151019
95

Завершите работу, не показывая диалоговое окно подтверждения:

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отправляется те же события 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сигнал через несколько секунд.

LRI
источник
-4

Выключение немедленно:

**sudo shutdown -h now**

Если вы чувствуете, что хотите задержать выключение, вы можете использовать следующий синтаксис команды:

**sudo shutdown -h +30**

(-h параметр установить время выключения, где (+) 30 минут для остановки системы)

CamelTM
источник
2
Информация, представленная в вашем ответе, уже включена в принятый ответ, и поэтому нет необходимости повторять то, что уже упомянуто и принято.
user3439894
-11

также полезно, чтобы выйти из командной строки терминала, введите 'exit':

[host:~user]$ exit
Гольбейн
источник
10
Каким образом это отключает, перезагружает или спит Mac?
bmike
В любом случае, я предпочитаю Ctrl-Dвыходить из системы, так как это не засоряет историю командной строки.
Mwfearnley