Was ist der Unterschied zwischen diesen Befehlen zum Herunterfahren eines Linux-Servers?


65

Lesen "Was ist der Unterschied zwischen Halt- und Shutdown-Befehlen?" Ich habe im Allgemeinen eine Idee, was der Befehl shutdown mit oder ohne -h / -r-Optionen bewirkt.

Der Befehl "halt" führt das Ausschalten des Systems auf Run-Level 0 des Systems durch.

Der Befehl "shutdown" führt ein Ausschalten des Systems auf Run-Level 1 ohne den Befehl -h oder -r aus.

Was ist mit dem Befehl "Poweroff" geht es in Run-Level 0 oder 1? Ist dies der einzige Hauptunterschied zwischen diesen drei Befehlen?



Dies sind einige der Dinge, die sich zum Beispiel für Solaris und FreeBSD erheblich unterscheiden. (Dort wird der Server normalerweise (fast) sofort angehalten / heruntergefahren, ohne dass zuerst die Runlevel geändert werden, um das Zeug herunterzufahren.)
Gert van den Berg

Antworten:


120

Und jetzt antwortete das System.

Sie verwenden laut Ihrer Frage Red Hat Enterprise Linux. Seit Version 7 wird dafür systemd verwendet. Keine der anderen Antworten ist für die Welt von systemd richtig; Auch sind einige der Annahmen in Ihrer Frage nicht.

  • Vergiss Runlevel ; Sie existieren, aber nur als Kompatibilitätsscheiben. Die systemd-Dokumentation besagt, dass das Konzept "veraltet" ist. Wenn Sie anfangen, dieses Zeug auf einem systemd Betriebssystem zu lernen, fangen Sie dort nicht an.
  • Vergiss die Manpage, die marcelm zitiert hat; Es stammt überhaupt nicht aus dem richtigen Toolset und ist eine Beschreibung des Befehls eines anderen Toolset, die für systemd falsch ist. haltDies ist der Befehl für die Dienstprogramme "System 5" von van Smoorenburg init.
  • Ignorieren Sie die Anweisungen, zu denen /sbin/haltein symbolischer Link besteht /sbin/reboot. das stimmt nicht mit systemd. Es gibt überhaupt kein separates rebootProgramm.
  • Ignorieren Sie die Anweisungen, haltoder rebootrufen Sie ein shutdownProgramm mit Befehlszeilenargumenten auf. Sie sind auch nicht wahr mit systemd. Es gibt überhaupt kein separates shutdownProgramm.

Jedes Systemverwaltungs-Toolset verfügt über eine Version dieser Dienstprogramme. systemd, Emporkömmling, nosh , van Smoorenburg initund BSD inithaben alle ihre eigenen halt, poweroffund so weiter. An jedem sind ihre Mechaniken etwas unterschiedlich. So sind ihre Manualseiten.

Im systemd Toolset halt, poweroff,reboot , telinit, und shutdownsind alle symbolischen Links zu /bin/systemctl. Sie sind alle Rückwärtskompatibilität Beilagen, die einfach Kürzeln sind für systemd primäre Befehlszeilenschnittstelle aufrufen: systemctl. Sie alles Karte (und in der Tat ist) gleiches einziges Programm. (Laut Konvention gibt die Shell an, von welchem ​​Namen sie aufgerufen wurde.)

Ziele, keine Runlevel

Die meisten dieser Befehle sind Kürzel für systemd zu sagen, mit systemctl, zu isolieren ein bestimmtes Ziel . Die Isolation wird in der systemctlManpage (siehe auch) erklärt, kann jedoch im Sinne dieser Antwort als Starten eines Ziels und Stoppen eines anderen angesehen werden. Die in systemd verwendeten Standardziele sind auf der systemd.specialManpage (8) aufgeführt.

Die Diagramme auf der bootupManpage (7) im Toolset systemd, insbesondere das letzte, zeigen, dass drei "endgültige" Ziele hier relevant sind:

  • halt.target- Sobald das System den Status der vollständigen Isolierung dieses Ziels erreicht hat, hat es den reboot(RB_HALT_SYSTEM)Systemaufruf aufgerufen. Der Kernel hat versucht, ein ROM-Überwachungsprogramm aufzurufen, oder die CPU einfach angehalten (unter Verwendung eines geeigneten Mechanismus).
  • reboot.target- Sobald das System den Status erreicht hat, dieses Ziel vollständig zu isolieren, hat es den reboot(RB_AUTOBOOT)Systemaufruf (oder das Äquivalent mit der magischen Befehlszeile) aufgerufen . Der Kernel hat versucht, einen Neustart auszulösen.
  • poweroff.target- Sobald das System den Status der vollständigen Isolierung dieses Ziels erreicht hat, hat es den reboot(RB_POWER_OFF)Systemaufruf aufgerufen. Der Kernel hat nach Möglichkeit versucht, das System von der Stromversorgung zu trennen.

Dies sind die Dinge, über die Sie nach dem endgültigen Systemstatus nachdenken sollten, und nicht die Laufebenen. Beachten Sie aus dem Diagramm, dass das systemd-Zielsystem selbst Dinge codiert, die in anderen Systemen eher implizit als explizit sind. Beispielsweise die Vorstellung, dass jedes dieser endgültigen Ziele das shutdown.targetZiel umfasst , sodass Dienste beschrieben werden, die vor dem Herunterfahren von beendet werden müssen sie in Konflikt mit dem shutdown.targetZiel haben.

systemctlversucht, Anforderungen an zu senden, systemd-logindwenn der anrufende Benutzer nicht der Superuser ist. Es werden auch verzögerte Abschaltungen an übergeben systemd-shutdownd. Und einige Shorthands lösen wallBenachrichtigungen aus. Abgesehen von diesen Komplexitäten, die diese Antwort um ein Vielfaches verlängern würden, vorausgesetzt, Sie sind derzeit der Superuser und fordern keine geplante Aktion an:

  • systemctl isolate halt.target hat die Abkürzungen:
    • shutdown -H now
    • systemctl halt
    • schlicht und schmucklos halt
  • systemctl isolate reboot.target hat die Abkürzungen:
    • shutdown -r now
    • telinit 6
    • systemctl reboot
    • schlicht und schmucklos reboot
  • systemctl isolate poweroff.target hat die Abkürzungen:
    • shutdown -P now
    • telinit 0
    • shutdown now
    • systemctl poweroff
    • schlicht und schmucklos poweroff
  • systemctl isolate rescue.target hat die Abkürzungen:
    • telinit 1
    • systemctl rescue
  • systemctl isolate multi-user.target hat die Abkürzungen:
    • telinit 2
    • telinit 3
    • telinit 4
  • systemctl isolate graphical.target hat die Kurzschrift:
    • telinit 5

Nach dem Parsen der verschiedenen Befehlszeilensyntaxen landen diese schließlich in denselben Codepfaden innerhalb des systemctlProgramms.

Anmerkungen:

  • Das traditionelle Verhalten von Optionen ohne Option shutdown nowbestand darin, in den Einzelbenutzermodus zu wechseln . Dies ist bei systemd nicht der Fall. rescue.target- Der Einzelbenutzermodus, der in systemd in Rettungsmodus umbenannt wird, ist mit dem shutdownBefehl nicht erreichbar .
  • telinit Ignoriert wirklich alle diese und symbolischen Links im Dateisystem, die in den Handbuchseiten beschrieben werden. Die oben genannten Zuordnungen sind in das Programm in einer Tabelle festverdrahtet .runlevelN.targetdefault.targetsystemctl
  • systemd hat keine Ahnung von einem aktuellen Runlevel . Die Ausführung dieser Befehle ist nicht an "Wenn Sie sich auf Run-Level N befinden " gebunden .
  • Die --forceOption, die halt, rebootund poweroffBefehle ist die gleiche wie zu sagen --force --forcezu den systemctl halt, systemctl rebootund systemctl poweroffBefehle. Dadurch wird systemctlversucht, reboot()direkt anzurufen . Normalerweise wird nur versucht, Ziele zu isolieren.
  • telinitist nicht dasselbe wie init. Sie sind verschiedene Programme in der Systemwelt, wobei letzteres ein anderer Name für das systemdProgramm ist, nicht für das systemctlProgramm. Das systemdProgramm ist nicht unbedingt mit einer Kompatibilität mit Van Smoorenburg kompiliert, und auf einigen Betriebssystemen beschwert es sich, dass es falsch aufgerufen wird, wenn man es versucht .init N

Weitere Lektüre


1
Dies ist für die meisten modernen Linux-Systeme sehr allgemein gehalten, also gibt es zum Beispiel Antworten wiert.me/2012/12/30/… Nach all den Jahren der Fragen verstehe ich endlich, was los ist und warum.
Jeroen Wiert Pluimers

systemctl rebootsollte gleichbedeutend sein mit systemctl start reboot.target --job-mode=replace-irreversible. Die Verwendung eines anderen Auftragsmodus ist weniger robust. unix.stackexchange.com/questions/381739/…
sourcejedi

1
Ich las Ihre gesamte Antwort und nahm auf, was ich konnte. Eine Frage bleibt, die gleiche, für die ich hierher gekommen bin, ist systemctl rebootder "sichere" Weg zum Neustart, z. B. init 6wie würden wir sonst einen sicheren Neustart durchführen?
Brian Thomas

25
  • haltWeist die Hardware an , alle CPU-Funktionen zu stoppen , lässt sie jedoch eingeschaltet. Dies bedeutet normalerweise, dass jemand den Computer neu starten oder manuell herunterfahren muss, indem er anschließend den Netzschalter drückt. Der spezifische Weg, dies zu erreichen, ist architekturspezifisch, aber zum Beispiel stellt der x86-Befehlssatz die HLTBefehle bereit , die die Zentraleinheit (CPU) anhalten, bis der nächste externe Interrupt ausgelöst wird.

  • poweroffWie halt, stoppt die CPU , sondern auch ein sendet ACPI Hardware - Signal , das das System anweisen , eine vollständige und sofortige Abschaltung zu beginnen. Dies entspricht in etwa dem Drücken des Netzschalters auf einem typischen Desktop-Computer.

Beide haltund poweroffsind normalerweise symbolische Links zur rebootausführbaren Datei, die normalerweise das shutdownTool mit den entsprechenden Argumenten ( -h, -Poder r) aufrufen , je nachdem, ob das Tool aufgerufen haltwurde poweroffoder ob rebootes verwendet wurde. Wenn die --forceOption an rebootoder auf Runlevel 0 oder 6 übergeben wird, rebootwird der reboot()Systemaufruf jedoch mit einem entsprechenden Befehlscode aufgerufen.


Thomas, vielen Dank für die Erklärung. Ich bin daran interessiert zu wissen, wie es ist, ein #init 0 zu machen, es gibt nicht viele Unterschiede, oder?
Win.T

@ Win.T Das Umschalten auf Runlevel 0 mit z. B. /sbin/init 0oder /sbin/telinit 0sollte das gleiche sein wie das Anhalten des Systems, obwohl die konkreten Schritte vom jeweiligen Init-System abhängen, wie z. B. System-V init , upstart oder systemd . Wenn Sie RHEL ausführen, würden Sie systemd verwenden.
Thomas Nyman

4
Hinweis für sich selbst: Zeigen Sie jedem, der sich über einen geheimen Win32-API-Aufruf beschwert, dass er neu gestartet wurde (2).
user253751

@immibis Aber Neustart ist absichtlich geheimnisvoll. Es erfordert die magischen Flaggen, so dass es sehr schwierig ist, aus Versehen zu tun.
Kevin Cox

4
@ KevinCox Das ist das Argument dafür, magische Flaggen zu fordern. Es ist weder ein Argument, um 4 verschiedene Werte für magic2 zu akzeptieren, noch um sich in einem PID-Namespace anders zu verhalten, noch um mehrere kaum zusammenhängende Vorgänge (wie das Festlegen des Verhaltens "Neustart bei Strg-Alt-Entf") in einer Funktion zusammenzufassen.
user253751

1

halt, poweroffUnd shutdown -hsind völlig gleichwertig. In der Tat machen Halt und Poweroff nichts anderes als callen shutdown -h. Aus der Manpage zum Anhalten / Ausschalten:

Wenn angehalten oder neu gestartet wird, wenn sich das System nicht auf Runlevel 0 oder 6 befindet, dh wenn es normal ausgeführt wird, wird stattdessen das Herunterfahren aufgerufen (mit dem Flag -h oder -r). Weitere Informationen finden Sie auf der Hilfeseite shutdown (8).

Beim Herunterfahren wird das System heruntergefahren, indem auf Runlevel 0 gewechselt wird.

Anhalten und Ausschalten (und Neustarten) spielen eine doppelte Rolle. Wenn sie beim Herunterfahren ausgeführt werden (dh in Runlevel 0 oder 6), führen sie die Operationen auf niedriger Ebene aus, die zum physischen Stoppen, Ausschalten oder Neustarten der Maschine erforderlich sind, wie in einer anderen Antwort beschrieben.


2
Welche RHEL-Version verwenden Sie? Normalerweise gibt es einen Unterschied zwischen Anhalten und Ausschalten (obwohl dies für eine Weile in vielen Distributionen nicht der Fall war, aber das war ein Fehler).
Bruno
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.