Quelle est la différence entre ces commandes pour faire tomber un serveur Linux?

65

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

La commande "arrêt" exécute le système hors tension pour exécuter le niveau d'exécution 0 du système.

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

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

Win.T
la source
C’est certaines des choses qui diffèrent de manière significative, par exemple Solaris et FreeBSD. (Là, ils arrêtent / arrêtent généralement (presque) immédiatement le serveur, sans changer les niveaux d'exécution pour arrêter tout ça en premier)
Gert van den Berg

Réponses:

120

Et maintenant, la réponse systemd.

Selon l'étiquette de votre question, vous utilisez Red Hat Enterprise Linux. Depuis la version 7, cela a utilisé 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 runlevels ; ils existent, mais uniquement en tant que compatibilité. La documentation de systemd indique que le concept est "obsolète". Si vous commencez à apprendre ce genre de 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 jeu d'outils, c'est une description de la commande d'un autre jeu d'outils, incorrecte pour celle de systemd. C’est celui qui haltcommande les utilitaires "System 5" de Van Smoorenburg init.
  • Ignorez les déclarations /sbin/haltconstituant un lien symbolique /sbin/reboot; ce n'est pas vrai avec systemd. Il n'y a pas de rebootprogramme séparé du tout.
  • Ignorez les instructions haltou rebootappelez un shutdownprogramme avec des arguments de ligne de commande; ils ne sont également pas vrais avec systemd. Il n'y a pas de shutdownprogramme séparé du tout.

Chaque jeu d'outils de gestion de système a sa version de ces utilitaires. systemd, arriviste, Nosh , van Smoorenburg initet BSD initont tous leurs propres halt, poweroffet ainsi de suite. Sur chacun leurs mécanismes sont légèrement différents. Ainsi sont leurs pages de manuel.

Dans le jeu d' outils systemd halt, poweroff,reboot , telinitet shutdownsont tous les liens symboliques vers /bin/systemctl. Ils sont tous les cales de compatibilité ascendante, qui sont simplement des raccourcis pour appeler l' interface de ligne de commande principale de systemd: systemctl. Ils correspondent tous à (et sont en fait) ce même programme unique . (Par convention, le shell lui dit sous quel nom il a été appelé.)

des cibles, pas des niveaux d'exécution

La plupart de ces commandes sont des raccourcis permettant d'indiquer à systemd, using systemctl, d' isoler une cible particulière . L'isolement est expliqué dans la systemctlpage de manuel (qv), mais peut être considéré, aux fins de cette réponse, comme un point de départ et un arrêt des autres. Les cibles standard utilisées dans systemd sont répertoriées dans la systemd.specialpage de manuel (8).

Les diagrammes de la bootuppage de manuel (7) dans le 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 a appelé l' reboot(RB_HALT_SYSTEM)appel système. Le noyau aura tenté d'entrer dans un programme de surveillance de la ROM ou simplement arrêté le processeur (en utilisant le mécanisme approprié).
  • reboot.target- Une fois que le système a atteint l'état d'isolement complet de cette cible, il aura appelé l' reboot(RB_AUTOBOOT)appel système (ou son é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 a appelé l' reboot(RB_POWER_OFF)appel système. Le noyau aura tenté de couper l’alimentation du système, si possible.

Ce sont les choses auxquelles vous devriez penser en définissant le système final, et non les niveaux d'exécution. Avis du diagramme que le système cible systemd lui - même code choses qui sont, dans d' autres systèmes, plus implicites qu'explicites: tels que l'idée que chacun de ces objectifs finaux englobe la shutdown.targetcible, de sorte que l' on décrit les services qui doivent être arrêtés avant l' arrêt par les avoir en conflit avec la shutdown.targetcible.

systemctltente d'envoyer des demandes à systemd-logindlorsque l'appelant n'est pas le superutilisateur. Il transmet également les arrêts différés à systemd-shutdownd. Et certains raccourcis déclenchent des wallnotifications. Ces complexités mises à part, ce qui rallongerait cette réponse plusieurs fois, en supposant que vous êtes actuellement le super-utilisateur et que vous ne demandez pas une action planifiée:

  • systemctl isolate halt.target a les raccourcis:
    • shutdown -H now
    • systemctl halt
    • sans fioritures halt
  • systemctl isolate reboot.target a les raccourcis:
    • shutdown -r now
    • telinit 6
    • systemctl reboot
    • sans fioritures reboot
  • systemctl isolate poweroff.target a les raccourcis:
    • shutdown -P now
    • telinit 0
    • shutdown now
    • systemctl poweroff
    • sans fioritures 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, celles-ci finissent par se retrouver dans les mêmes chemins de code dans le systemctlprogramme.

Remarques:

  • Le comportement traditionnel de l'option-less shutdown nowa été de passer en mode mono-utilisateur . Ce n'est pas le cas avec systemd. rescue.target- le mode mono-utilisateur étant renommé le mode de secours dans systemd - n'est pas accessible avec la shutdowncommande.
  • telinit ignore réellement tous ces liens et liens symboliques dans le système de fichiers décrit par les pages de manuel. Les mappages susmentionnés sont intégrés au programme, dans un tableau.runlevelN.targetdefault.targetsystemctl
  • systemd n'a aucune notion d'un niveau d'exécution actuel . Le fonctionnement de ces commandes ne dépend d'aucun "si vous êtes au niveau d'exécution N ".
  • L' --forceoption de la halt, rebootet des poweroffcommandes est la même chose que dire --force --forceaux systemctl halt, systemctl rebootet les systemctl poweroffcommandes. Cela fait systemctlessayer d'appeler reboot()directement. Normalement, il essaie simplement d'isoler les cibles.
  • telinitn'est pas la même chose que init. Ce sont différents programmes dans le monde systemd, ce dernier étant un autre nom pour le systemdprogramme, pas pour le systemctlprogramme. Le systemdprogramme n’est pas nécessairement compilé avec la moindre compatibilité avec van Smoorenburg et, sur certains systèmes d’exploitation système, il se plaint d’être invoqué incorrectement, le cas échéant .init N

Lectures complémentaires

JdeBP
la source
1
Ceci est très générique pour la plupart des systèmes Linux modernes, donc par exemple, répond wiert.me/2012/12/30/… Après toutes ces années de questions, je comprends enfin ce qui se passe et pourquoi.
Jeroen Wiert Pluimers
systemctl rebootdevrait être équivalent à systemctl start reboot.target --job-mode=replace-irreversible. L'utilisation de tout autre mode d'emploi est moins robuste. unix.stackexchange.com/questions/381739/…
sourcejedi
1
J'ai lu toute votre réponse et absorbé ce que je pouvais. Une question demeure, la même que celle pour laquelle je suis venu ici, est systemctl rebootle moyen "sans danger" de redémarrer, par exemple, init 6quel est le moyen par lequel nous ferions autrement un redémarrage sans danger?
Brian Thomas
25
  • haltordonne au matériel d’ arrêter toutes les fonctions de la CPU , mais le laisse allumé. Cela signifie généralement que quelqu'un doit redémarrer ou éteindre la machine manuellement en appuyant ensuite sur le bouton d'alimentation. La manière spécifique d’atteindre cet objectif dépend de l’architecture, mais par exemple, le jeu d’instructions x86 fournit les HLTinstructions qui arrêtent l’unité centrale de traitement (CPU) jusqu’à ce que la prochaine interruption externe soit déclenchée.

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

Les deux haltet poweroffsont généralement des liens symboliques vers l' rebootexécutable, qui invoque généralement l' shutdownoutil avec les arguments appropriés ( -h, -Pou r) en fonction de si halt, poweroffou a rebootété utilisé pour invoquer l'outil. Cependant, lorsque l' --forceoption est passée à rebootou aux niveaux d'exécution 0 ou 6, rebootl' reboot()appel système est appelé avec le code de commande approprié.

Thomas Nyman
la source
Thomas, merci beaucoup de m'avoir expliqué. Je suis intéressé de savoir ce qu’il faut faire avec #init 0, il n’ya pas beaucoup de différences, non?
Win.T
@ Win.T Passer au niveau d'exécution 0 en utilisant, par exemple, /sbin/init 0ou /sbin/telinit 0devrait être identique à arrêter le système, bien que les étapes spécifiques à prendre dépendent du système init, tel que System-V init , upstart ou systemd . Si vous utilisez RHEL, vous utiliseriez systemd.
Thomas Nyman
4
Remarque personnelle: chaque fois que quelqu'un se plaint d'un appel mystérieux à l'API Win32, montrez-lui reboot (2).
user253751
@immibis Mais le redémarrage est délibérément mystérieux. Cela nécessite des drapeaux magiques de sorte qu'il est très difficile de le faire par accident.
Kevin Cox
4
@ KevinCox C'est l'argument pour exiger des drapeaux magiques. Ce n'est pas l'argument pour accepter 4 valeurs différentes pour magic2, ni pour se comporter différemment dans un espace de noms PID, ni pour regrouper plusieurs opérations à peine liées (comme définir le comportement de redémarrage sur Ctrl-Alt-Suppr) dans une seule fonction.
user253751
1

halt, poweroffEt shutdown -hsont tout à fait équivalent. En fait, stop et poweroff ne font qu'appeler shutdown -h. Depuis la page de manuel Halte / Poweroff:

Si halt ou reboot est appelé lorsque le système ne se trouve pas au niveau d'exécution 0 ou 6, autrement dit, lorsqu'il fonctionne normalement, shutdown sera appelé à la place (avec l'indicateur -h ou -r). Pour plus d'informations, voir la page de manuel shutdown (8).

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

L'arrêt et l'extinction (et le redémarrage) remplissent un double rôle. Lorsqu'elles sont exécutées en cours d'arrêt (c'est-à-dire au niveau d'exécution 0 ou 6), elles effectuent les opérations de bas niveau requises pour arrêter physiquement, éteindre ou redémarrer la machine, comme décrit dans une autre réponse.

marcelm
la source
2
Quelle version de RHEL utilisez-vous? Il y a normalement une différence entre stop et poweroff (bien que pendant un moment, ce n’était pas le cas dans de nombreuses distributions, mais c’était un bogue).
Bruno