А теперь системный ответ.
В соответствии с тегом вашего вопроса вы используете Red Hat Enterprise Linux. Начиная с версии 7, он использовал systemd. Ни один из других ответов не верен для мира systemd; и даже не некоторые из предположений в вашем вопросе.
- Забудьте об уровнях выполнения ; они существуют, но только как совместимость прокладок. Документация systemd гласит, что концепция «устарела». Если вы начинаете изучать этот материал в операционной системе systemd, не начинайте там.
- Забудьте о странице руководства, которую цитировал Марсельм; это вовсе не из правильного набора инструментов, а описание команды другого набора инструментов, неправильное для systemd. Это для
halt
команды из Ван Смуренбурга утилиты "Система 5" init
.
- Игнорируйте утверждения, которые
/sbin/halt
являются символической ссылкой на /sbin/reboot
; это не так с systemd. Там нет отдельной reboot
программы вообще.
- Игнорировать операторы, которые
halt
или reboot
вызывают shutdown
программу с аргументами командной строки; они также не верны с systemd. Там нет отдельной shutdown
программы вообще.
Каждый набор инструментов для управления системой имеет свою версию этих утилит. Systemd, выскочка, перекус , ван Smoorenburg init
и BSD init
все имеют свои собственные halt
, poweroff
и так далее. На каждой их механика немного отличается. Как и их справочные страницы.
В Systemd набор инструментов halt
, poweroff
,reboot
, telinit
, и shutdown
являются все символические ссылки /bin/systemctl
. Они все регулировочные шайбы с обратной совместимостью, которые просто сокращение для вызова интерфейса первичного командной строки Systemd в: systemctl
. Они все на карте (и на самом деле являются) той же одной программе. (По соглашению оболочка сообщает ему, по какому имени она была вызвана.)
цели, а не уровни выполнения
Большинство из этих команд являются сокращениями для сообщения systemd, используя systemctl
для выделения конкретной цели . Изоляция объяснена на systemctl
странице руководства (см. В разделе qv), но для целей этого ответа ее можно рассматривать как начало цели и остановку любых других. Стандартные цели, используемые в systemd, перечислены на systemd.special
странице руководства (8).
Диаграммы на bootup
странице руководства (7) в наборе инструментов systemd, в частности на последней, показывают, что здесь есть три «конечные» цели:
halt.target
- Как только система достигнет состояния полной изоляции этой цели, она вызовет reboot(RB_HALT_SYSTEM)
системный вызов. Ядро попытается войти в программу монитора ПЗУ или просто остановит ЦП (используя любой подходящий для этого механизм).
reboot.target
- Как только система достигнет состояния полной изоляции этой цели, она вызовет reboot(RB_AUTOBOOT)
системный вызов (или эквивалент магической командной строки). Ядро попытается запустить перезагрузку.
poweroff.target
- Как только система достигнет состояния полной изоляции этой цели, она вызовет reboot(RB_POWER_OFF)
системный вызов. Ядро будет пытаться отключить питание системы, если это возможно.
Это то , о чем вы должны думать, как о конечной системе, а не о прохождении уровней. Обратите внимание на диаграмму, что целевая система systemd сама кодирует вещи, которые в других системах являются неявными, а не явными: например, представление о том, что каждая из этих конечных целей охватывает shutdown.target
цель, так что описываются службы, которые должны быть остановлены перед выключением имея их в конфликт с к shutdown.target
цели.
systemctl
пытается отправить запросы, systemd-logind
когда вызывающий пользователь не является суперпользователем. Он также передает отложенные отключения на systemd-shutdownd
. И некоторые сокращения вызывают wall
уведомления. Помимо тех сложностей, которые могут сделать этот ответ в несколько раз длиннее, если вы в данный момент являетесь суперпользователем и не запрашиваете запланированное действие:
systemctl isolate halt.target
имеет короткие номера:
shutdown -H now
systemctl halt
- просто без украшений
halt
systemctl isolate reboot.target
имеет короткие номера:
shutdown -r now
telinit 6
systemctl reboot
- просто без украшений
reboot
systemctl isolate poweroff.target
имеет короткие номера:
shutdown -P now
telinit 0
shutdown now
systemctl poweroff
- просто без украшений
poweroff
systemctl isolate rescue.target
имеет короткие номера:
telinit 1
systemctl rescue
systemctl isolate multi-user.target
имеет короткие номера:
telinit 2
telinit 3
telinit 4
systemctl isolate graphical.target
имеет стенографию:
После анализа различных синтаксисов командной строки все они в конечном итоге оказываются в одних и тех же путях кода внутри systemctl
программы.
Примечания:
- Традиционное поведение параметра option-less
shutdown now
заключается в переключении в однопользовательский режим . Это не так с systemd. rescue.target
- однопользовательский режим переименовывается в режим восстановления в systemd - недоступен с помощью shutdown
команды.
telinit
действительно полностью игнорирует все те и символические ссылки в файловой системе, которые описаны на страницах руководства. Вышеуказанные отображения встроены в программу в виде таблицы.runlevelN.target
default.target
systemctl
- systemd не имеет представления о текущем уровне выполнения . Работа этих команд не зависит от любого "если вы находитесь на уровне выполнения N ".
--force
Вариант к halt
, reboot
и poweroff
команды так же , как говорят --force --force
в systemctl halt
, systemctl reboot
и systemctl poweroff
команду. Это заставляет systemctl
пытаться позвонить reboot()
напрямую. Обычно он просто пытается изолировать цели.
telinit
это не то же самое, что init
. Это разные программы в мире systemd, последнее - другое название systemd
программы, а не systemctl
программы. systemd
Программа не обязательно скомпилирован с любой совместимостью ван Smoorenburg на всех, и на некоторых операционных системах Systemd жалуется на время вызова неправильно , если один попыток .init N
дальнейшее чтение