Каково различие между этими командами для перевода в нерабочее состояние сервера Linux?

Если Вы не должны использовать awk, Вы могли бы посмотреть на od ("восьмеричный дамп"):

$ echo 1A34532112345 | od -t x1
0000000 31 41 33 34 35 33 32 31 31 32 33 34 35 0a
0000016

68
06.05.2017, 02:44
3 ответа

А теперь ответ systemd.

Согласно тегу в вашем вопросе вы используете Red Hat Enterprise Linux. Начиная с версии 7, он использовал systemd. Ни один из других ответов не подходит для мира systemd; и даже некоторые предположения в вашем вопросе.

  • Забудьте об уровнях выполнения ; они существуют, но только как прокладки совместимости. В документации systemd указано, что концепция «устарела». Если вы начинаете изучать этот материал в операционной системе systemd, не начинайте с этого.
  • Забудьте о странице руководства, которую цитировал Марсельм; это совсем не из того набора инструментов, а описание команды другого набора инструментов, неверное для systemd. Это команда halt из утилит van Smoorenburg "System 5" init .
  • Игнорируйте утверждения, что / sbin / halt является символической ссылкой на / sbin / reboot ; это не так с systemd. Отдельной программы перезагрузки нет вообще.
  • Игнорируйте инструкции, которые останавливают или перезагружают , вызывают программу shutdown с аргументами командной строки; они также не верны с systemd. Отдельной программы выключения нет вообще.

У каждого набора инструментов управления системой есть своя версия этих утилит. systemd, upstart, nosh , van Smoorenburg init и BSD init имеют свои собственные halt , poweroff , и так далее. На каждом их механика немного отличается. Как и их справочные страницы.

В наборе инструментов systemd halt , poweroff , reboot , telinit и shutdown имеют значения ] все символьные ссылки на / bin / systemctl . Это все прокладки обратной совместимости, которые являются просто сокращениями для вызова основного интерфейса командной строки systemd: systemctl . Все они отображаются (и фактически являются) одной и той же единственной программой. (По соглашению оболочка сообщает ей, под каким именем она была вызвана.)

цели, а не уровни выполнения

Большинство этих команд являются сокращениями для сообщения systemd, используя systemctl , на изолировать конкретную цель . Изоляция объясняется на странице руководства systemctl (q.v.), но для целей этого ответа ее можно рассматривать как запуск цели и остановку любых других. Стандартные цели, используемые в systemd, перечислены на странице руководства systemd.special (8).

Диаграммы на странице руководства bootup (7) в наборе инструментов systemd, в частности последней, показывают, что здесь есть три «последних» цели:

  • halt.target - Как только система достигнет состояния полной изоляции этой цели, она вызовет системный вызов reboot (RB_HALT_SYSTEM) . Ядро попытается войти в программу монитора ПЗУ или просто остановит ЦП (используя любой подходящий для этого механизм).
  • перезагрузка.target - Как только система достигнет состояния полной изоляции этой цели, она вызовет системный вызов reboot (RB_AUTOBOOT) (или эквивалент с волшебной командной строкой). Ядро попытается запустить перезагрузку.
  • poweroff.target - Как только система достигнет состояния полной изоляции этой цели, она вызовет системный вызов reboot (RB_POWER_OFF) . Если возможно, ядро ​​попытается отключить питание системы.

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

systemctl пытается отправить запросы к systemd-logind , когда вызывающий пользователь не является суперпользователем. Он также передает отложенные отключения на systemd-shutdownd . А некоторые сокращения вызывают уведомления стены . Оставим в стороне эти сложности, которые увеличили бы этот ответ в несколько раз, если предположить, что вы в настоящее время являетесь суперпользователем и не запрашиваете запланированное действие:

  • systemctl изолировать остановку.target имеет сокращенные обозначения:
    • shutdown -H now
    • systemctl halt
    • plain unadorned halt
  • systemctl изолировать reboot.target имеет сокращенные обозначения:
    • shutdown -r now
    • telinit 6
    • systemctl reboot
    • plain unadorned reboot
  • systemctl изолировать poweroff.target имеет сокращение:
    • выключение -P now
    • telinit 0
    • shutdown now
    • systemctl poweroff
    • plain unadorned poweroff
  • systemctl изолировать rescue.target имеет сокращенные обозначения: {{1} }
    • telinit 1
    • systemctl rescue
  • systemctl изолировать multi-user.target имеет сокращенные обозначения:
    • telinit 2
    • telinit 3
    • telinit 4
  • systemctl isolate graphical.target имеет сокращение:
    • telinit 5

После анализа различных синтаксисов командной строки все они в конечном итоге заканчиваются вверх по тем же путям кода внутри программы systemctl .

Примечания:

  • Традиционное поведение выключения без дополнительных опций заключалось в переключении в однопользовательский режим . Это не относится к systemd. rescue.target - однопользовательский режим, переименованный в rescue mode в systemd - недоступен с помощью команды shutdown .
  • telinit действительно полностью игнорирует все те уровень выполнения N .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 вовсе не обязательно компилируется с какой-либо совместимостью van Smoorenburg, и в некоторых операционных системах systemd жалуется на неправильный вызов при попытке init N .

Дополнительная литература

125
27.01.2020, 19:31
  • stop инструктирует аппаратное обеспечение, чтобы остановило все функции процессора , но оставило его в выключенном состоянии. Обычно это означает, что кто-то должен перезагрузить или выключить машину вручную, нажав кнопку питания после этого. Конкретный способ достижения этого - архитектурные особенности, но, например, набор команд x86 предоставляет команды HLT , которые останавливают центральный процессор (CPU) до следующего внешнего прерывания.

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

Оба сигнала остановки и выключения питания обычно являются символическими ссылками на исполняемый файл перезагрузки , который обычно вызывает инструмент выключения с соответствующими аргументами (-h, -P или r) в зависимости от того, использовался ли для вызова инструмента остановка , отключение питания или перезагрузка . Однако, когда опция - force передается на reboot, или когда на уровне выполнения 0 или 6, reboot вызывает системный вызов reboot() с соответствующим кодом команды.

25
27.01.2020, 19:31

halt , poweroff и shutdown -h полностью эквивалентны. Фактически, halt и poweroff не делают ничего, кроме вызова shutdown -h . Из справочной страницы halt / poweroff:

Если вызывается остановка или перезагрузка, когда система не находится на уровне запуска 0 или 6, другими словами, когда она работает нормально, вместо этого будет вызываться завершение работы (с флагом -h или -r) . Для получения дополнительной информации см. Справочную страницу shutdown (8).

Завершение работы затем переходит к завершению работы системы путем переключения на уровень выполнения 0.

Остановка и отключение питания (и перезагрузка) выполняют двойную роль; когда они выполняются в процессе выключения (то есть на уровне выполнения 0 или 6), они выполняют операции низкого уровня, необходимые для физической остановки, выключения или перезагрузки машины, как описано в другом ответе.

1
27.01.2020, 19:31

Теги

Похожие вопросы