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

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

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

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

перезагрузка для перезагрузки тоже работает.

Ответы (4)

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

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

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

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

sudo shutdown -r now

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

sudo shutdown -h +60

Из комментариев есть две вещи, которые нужно решить

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

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

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

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

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, что и выше, когда вы выходите из системы, перезагружаетесь, выключается или переводите Mac в обычный режим сна. См. технические вопросы и ответы QA1134: Программно вызывающий перезапуск, завершение работы и/или выход из системы .

Согласно man shutdown, shutdown -h nowи shutdown -r nowsend обрабатывает TERMсигнал, за которым следует KILLсигнал.

Согласно Руководству по программированию демонов и служб , когда вы говорите loginwindowвыйти из системы, процессам, которые поддерживают внезапное завершение, отправляется KILLсигнал, а процессы, которые не поддерживают внезапное завершение, завершаются по-разному: приложения Cocoa получают applicationShouldTerminate:метод делегата, приложения переднего плана получают kAEQuitApplicationсобытие Apple, фоновые приложения получают kAEQuitApplicationсобытие Apple, за которым следует KILLсигнал, а демоны получают TERMсигнал, за которым следует KILLсигнал через несколько секунд.

как насчет завершения работы с помощью applescript после тайм-аута? Я полагаю sleep 60 && osascript -e 'tell app "System Events" to shut down', это может сработать, но как это сделать только с помощью applescript?
Поэтому я попытался использовать технику applescript для мягкой перезагрузки по сценарию. Проблема в том, что если к машине подключены пользователи общего доступа к файлам, она не перезагружается. Он выдает сообщение «Подключены пользователи ...», в котором НЕТ встроенного таймера. Итак, есть ли способ сначала сбросить всех пользователей общего доступа к файлам, прежде чем запускать эту команду?

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

sudo shutdown -h now

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

sudo shutdown -h +30

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

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

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

[host:~user]$ exit
Каким образом это выключает, перезагружает или переводит Mac в спящий режим?