web-dev-qa-db-fra.com

Quelle est la différence entre ces commandes pour arrêter un serveur Linux?

Reading "Quelle est la différence entre les commandes Halt et Shutdown?" , j'ai généralement une idée de ce que fait l'arrêt de la commande, avec ou sans les options -h/-r.

La commande "stop" exécute la mise hors tension du système au niveau d'exécution 0 du système.

La commande "shutdown" effectue une mise hors tension du système au niveau d'exécution 1 sans commande -h ou -r.

Qu'en est-il de la commande "poweroff" qui va au niveau d'exécution 0 ou 1? Est-ce la seule différence principale entre ces trois commandes?

69
Win.T

Et maintenant, la réponse systemd.

Vous utilisez, selon la balise de votre question, Red Hat Enterprise Linux. Depuis la version 7, cela utilise systemd. Aucune des autres réponses n'est correcte pour le monde de systemd; ni même certaines des hypothèses dans votre question.

  • Oubliez les niveaux d'exécution ; ils existent, mais uniquement en tant que cales de compatibilité. La documentation de systemd indique que le concept est "obsolète". Si vous commencez à apprendre ces choses sur un système d'exploitation systemd, ne commencez pas par là.
  • Oubliez la page de manuel citée par marcelm; ce n'est pas du tout le bon ensemble d'outils, et c'est une description de la commande d'un autre ensemble d'outils, incorrecte pour systemd. C'est celui de la commande halt des utilitaires "System 5" init de van Smoorenburg.
  • Ignorez les déclarations selon lesquelles /sbin/halt Est un lien symbolique vers /sbin/reboot; ce n'est pas vrai avec systemd. Il n'y a aucun programme reboot séparé.
  • Ignorez les instructions selon lesquelles halt ou reboot appellent un programme shutdown avec des arguments de ligne de commande; ils ne sont pas non plus vrais avec systemd. Il n'y a aucun programme shutdown séparé.

Chaque jeu d'outils de gestion système a sa version de ces utilitaires. systemd, upstart, nosh , van Smoorenburg init et BSD init ont tous leurs propres halt, poweroff, etc. en avant. Sur chacun leur mécanique est légèrement différente. Tout comme leurs pages de manuel.

Dans le jeu d'outils systemd halt, poweroff, reboot , telinit et shutdown sont tous les liens symboliques vers /bin/systemctl. Ce sont tous des shims à compatibilité descendante, qui sont simplement des raccourcis pour appeler l'interface de ligne de commande principale de systemd: systemctl. Ils sont tous mappés vers (et en fait sont) le même programme unique . (Par convention, le shell lui indique par quel nom il a été invoqué.)

des cibles, pas des niveaux d'exécution

La plupart de ces commandes sont des raccourcis pour indiquer à systemd, en utilisant systemctl, d'isoler une cible particulière . L'isolement est expliqué dans la page de manuel systemctl (q.v.), mais peut être, pour les besoins de cette réponse, considéré comme le démarrage d'une cible et l'arrêt de toute autre. Les cibles standard utilisées dans systemd sont répertoriées sur la page de manuel systemd.special (8).

Les diagrammes de la page de manuel bootup (7) du jeu d'outils systemd, en particulier le dernier, montrent qu'il y a trois cibles "finales" qui sont pertinentes ici:

  • halt.target - Une fois que le système a atteint l'état d'isolement complet de cette cible, il aura appelé l'appel système reboot(RB_HALT_SYSTEM). Le noyau aura tenté d'entrer un programme de surveillance ROM, ou simplement arrêté le processeur (en utilisant le mécanisme approprié pour le faire).
  • reboot.target - Une fois que le système a atteint l'état d'isolement complet de cette cible, il aura appelé l'appel système reboot(RB_AUTOBOOT) (ou l'équivalent avec la ligne de commande magique). Le noyau aura tenté de déclencher un redémarrage.
  • poweroff.target - Une fois que le système a atteint l'état d'isolement complet de cette cible, il aura appelé l'appel système reboot(RB_POWER_OFF). Si possible, le noyau aura tenté de couper l'alimentation du système.

Ces sont les choses auxquelles vous devez penser en tant qu'états finaux du système, pas les niveaux d'exécution. Notez à partir du diagramme que le système cible systemd lui-même code des choses qui sont, dans d'autres systèmes, implicites plutôt qu'explicites: comme la notion que chacune de ces cibles finales englobe la cible shutdown.target, De sorte que l'on décrit des services qui doit être arrêté avant l'arrêt en les faisant entrer en conflit avec la cible shutdown.target.

systemctl essaie d'envoyer des demandes à systemd-logind lorsque l'utilisateur appelant n'est pas le superutilisateur. Il transmet également les arrêts différés à systemd-shutdownd . Et certains raccourcis déclenchent des notifications wall. Ces complexités mises à part, qui rendraient cette réponse plusieurs fois plus longue, en supposant que vous êtes actuellement le superutilisateur et que vous ne demandez pas une action planifiée:

  • systemctl isolate halt.target A les raccourcis:
    • shutdown -H now
    • systemctl halt
    • simple sans ornement halt
  • systemctl isolate reboot.target A les raccourcis:
    • shutdown -r now
    • telinit 6
    • systemctl reboot
    • simple sans ornement reboot
  • systemctl isolate poweroff.target A les raccourcis:
    • shutdown -P now
    • telinit 0
    • shutdown now
    • systemctl poweroff
    • simple sans ornement poweroff
  • systemctl isolate rescue.target A les raccourcis:
    • telinit 1
    • systemctl rescue
  • systemctl isolate multi-user.target A les raccourcis:
    • telinit 2
    • telinit 3
    • telinit 4
  • systemctl isolate graphical.target A le raccourci:
    • telinit 5

Après avoir analysé les différentes syntaxes de ligne de commande différentes, celles-ci finissent toutes par se retrouver dans les mêmes chemins de code à l'intérieur du programme systemctl.

Remarques:

  • Le comportement traditionnel de l'option sans $ shutdown now A été de passer en mode mono-utilisateur . Ce n'est pas le cas avec systemd. rescue.target - le mode mono-utilisateur renommé en mode de secours dans systemd - n'est pas accessible avec la commande shutdown.
  • telinit ignore vraiment tous ces liens symboliques runlevelN.target Et default.target Dans le système de fichiers qui les pages de manuel décrivent. Les mappages précités sont câblés dans le programme systemctl, dans une table.
  • systemd n'a aucune notion d'un niveau d'exécution courant . Le fonctionnement de ces commandes n'est subordonné à aucun "si vous êtes au niveau de l'exécution [~ # ~] n [~ # ~] ".
  • L'option --force Pour les commandes halt, reboot et poweroff revient à dire --force --force À systemctl halt, systemctl reboot Et systemctl poweroff Commandes. Cela oblige systemctl à appeler directement reboot(). Normalement, il essaie simplement d'isoler les cibles.
  • telinit n'est pas identique à init. Ce sont des programmes différents dans le monde systemd, ce dernier étant un autre nom pour le programme systemd, pas pour le programme systemctl. Le programme systemd n'est pas nécessairement compilé du tout avec la compatibilité de van Smoorenburg, et sur certains systèmes d'exploitation systemd se plaint d'être mal appelé si l'on essaie init N.

Lectures complémentaires

128
JdeBP
  • halt ordonne au matériel de arrêter toutes les fonctions du processeur , mais le laisse dans un état sous tension. Cela signifie généralement que quelqu'un doit redémarrer ou arrêter la machine manuellement en appuyant ensuite sur le bouton d'alimentation. La manière spécifique d'y parvenir est spécifique à l'architecture, mais par exemple, le jeu d'instructions x86 fournit les instructions HLT qui arrêtent l'unité centrale (CPU) jusqu'à ce que la prochaine interruption externe soit déclenchée.

  • poweroff , comme halt, arrête le CPU mais envoie également un signal matériel ACPI qui demandera au système de commencer par un arrêt complet et immédiat. Cela revient à peu près à appuyer sur le bouton d'alimentation d'un ordinateur de bureau classique.

halt et poweroff sont généralement des liens symboliques vers l'exécutable reboot, qui invoque généralement l'outil shutdown avec l'outil approprié (-h, -P ou r) selon que halt, poweroff ou reboot a été utilisé pour appeler l'outil. Cependant, lorsque l'option --force Est passée à reboot, ou lorsqu'elle est au niveau d'exécution 0 ou 6, reboot invoquera la reboot() appel système avec un code de commande approprié lui-même.

25
Thomas Nyman

halt, poweroff et shutdown -h sont complètement équivalents. En fait, l'arrêt et la mise hors tension ne font qu'appeler shutdown -h. Depuis la page de manuel stop/poweroff:

Si l'arrêt ou le redémarrage est appelé lorsque le système n'est pas au niveau d'exécution 0 ou 6, en d'autres termes lorsqu'il fonctionne normalement, l'arrêt sera appelé à la place (avec l'indicateur -h ou -r). Pour plus d'informations, consultez la page de manuel shutdown (8).

L'arrêt procède ensuite à l'arrêt du système en passant au niveau d'exécution 0.

L'arrêt et la mise hors tension (et le redémarrage) jouent un double rôle; lorsqu'ils sont exécutés en cours d'arrêt (c'est-à-dire au niveau d'exécution 0 ou 6), ils effectuent les opérations de bas niveau nécessaires pour arrêter physiquement, éteindre ou redémarrer la machine, comme décrit dans une autre réponse.

1
marcelm