А теперь системный ответ.
В соответствии с тегом вашего вопроса вы используете 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.targetdefault.targetsystemctl
- 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
дальнейшее чтение