Lire « 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 "halt" éteint le 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 passe en run-level 0 ou 1 ?
Est-ce la seule différence principale entre ces trois commandes ?
Réponse acceptée :
Et maintenant, la réponse systemd.
Vous utilisez, selon le tag 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 de votre question.
- Oubliez les niveaux d'exécution ; ils existent, mais uniquement en tant que cales de compatibilité. La documentation 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 ensemble d'outils, et c'est une description de la commande d'un autre ensemble d'outils, incorrecte pour systemd. C'est celui du
haltcommande de van Smoorenburg "System 5"initutilitaires. - Ignorez les instructions qui
/sbin/haltest un lien symbolique vers/sbin/reboot; ce n'est pas vrai avec systemd. Il n'y a pas derebootséparé programme du tout. - Ignorer les instructions qui
haltourebootinvoquer unshutdownprogramme avec des arguments de ligne de commande ; ils ne sont pas non plus vrais avec systemd. Il n'y a pas d'shutdownséparé programme du tout.
Chaque ensemble d'outils de gestion de système a sa version de ces utilitaires. systemd, parvenu, nosh, van Smoorenburg init , et BSD init tous ont leur propre shutdown , poweroff , et ainsi de suite. Sur chacun leurs mécaniques sont légèrement différentes. Il en va de même pour leurs pages de manuel.
Dans le jeu d'outils systemd halt ,poweroff ,reboot , telinit , et shutdown sont tous liens symboliques vers /bin/systemctl . Ils sont tous shims de rétrocompatibilité, qui sont simplement des raccourcis pour invoquer l'interface de ligne de commande principale de systemd :systemctl halt . Ils correspondent tous (et sont en fait) au même simple programme. (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 halt , pour isoler une cible particulière . L'isolement est expliqué dans le systemctl halt page de manuel (qv), mais peut être, aux fins de cette réponse, considérée comme le démarrage d'une cible et l'arrêt de toutes les autres. Les cibles standard utilisées dans systemd sont listées sur le systemd.special (8) page de manuel.
Les diagrammes sur le bootup (7) la page de manuel de l'ensemble d'outils systemd, en particulier la dernière, montre qu'il y a trois cibles "finales" qui sont pertinentes ici :
halt.target— Une fois que le système aura atteint l'état d'isolement complet de cette cible, il aura appelé lereboot(RB_HALT_SYSTEM)appel système. Le noyau aura tenté d'entrer dans un programme de surveillance de ROM, ou simplement arrêté le processeur (en utilisant le mécanisme approprié pour le faire).reboot.target— Une fois que le système aura atteint l'état d'isolement complet de cette cible, il aura appelé lereboot(RB_AUTOBOOT)appel système (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 aura atteint l'état d'isolement complet de cette cible, il aura appelé lereboot(RB_POWER_OFF)appel système. Le noyau aura tenté de couper l'alimentation du système, si possible.
Ces sont les choses auxquelles vous devriez penser lorsque le système final l'indique, pas les niveaux d'exécution. Remarquez à partir du diagramme que le système cible systemd lui-même encode des choses qui sont, dans d'autres systèmes, implicites plutôt qu'explicites :comme la notion que chacune de ces cibles finales englobe le shutdown.target cible, afin que l'on décrive les services qui doivent être arrêtés avant l'arrêt en les mettant en conflit avec le shutdown.target cible.
systemctl halt essaie d'envoyer des requêtes à 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 wall notifications. Ces complexités mises à part, ce qui rendrait cette réponse plusieurs fois plus longue, en supposant que vous êtes actuellement le superutilisateur et que vous ne demandez pas d'action planifiée :
systemctl isolate halt.targeta les raccourcis :shutdown -H nowsystemctl halthaltsimple sans fioritures
systemctl isolate reboot.targeta les raccourcis :shutdown -r nowtelinit 6systemctl rebootrebootsans fioritures
systemctl isolate poweroff.targeta les raccourcis :shutdown -P nowtelinit 0shutdown nowsystemctl poweroffpoweroffsimple sans fioritures
systemctl isolate rescue.targeta les raccourcis :telinit 1systemctl rescue
systemctl isolate multi-user.targeta les raccourcis :telinit 2telinit 3telinit 4
systemctl isolate graphical.targeta le raccourci :telinit 5
Après avoir analysé les différentes syntaxes de ligne de commande, celles-ci se retrouvent toutes dans les mêmes chemins de code à l'intérieur du systemctl halt programme.
Remarques :
- Le comportement traditionnel de l'
shutdown nowsans option a été de passer en mode mono-utilisateur . Ce n'est pas le cas avec systemd.rescue.target— le mode mono-utilisateur est renommé mode de secours dans systemd - n'est pas accessible avec leshutdowncommande. telinitfait vraiment ignorer complètement tous cesrunlevelN.targetetdefault.targetliens symboliques dans le système de fichiers que les pages de manuel décrivent. Les mappages ci-dessus sont câblés dans lesystemctl haltprogramme, dans un tableau.- systemd n'a aucune notion de niveau d'exécution actuel . Le fonctionnement de ces commandes n'est pas conditionné par "si vous êtes au niveau d'exécution N ".
- Le
--forcel'optionhalt,reboot, etpoweroffcommandes revient à dire--force --forceà l'arrêtsystemctl halt,systemctl reboot, etsystemctl poweroffcommandes. Cela rendsystemctl haltessayez d'appelerreboot()directement. Normalement, il essaie simplement d'isoler les cibles. telinitn'est pas identique àinit. Ce sont des programmes différents dans le monde systemd, ce dernier étant un autre nom pour lesystemdprogramme, pas pour lesystemctl haltprogramme. Lesystemdle programme n'est pas nécessairement compilé avec une compatibilité van Smoorenburg, et sur certains systèmes d'exploitation systemd se plaint d'être appelé de manière incorrecte si l'on tenteinit N.
Autres lectures
- Existe-t-il de bonnes raisons d'arrêter le système sans couper l'alimentation ?
- Pourquoi `init 0` entraîne-t-il des "arguments excessifs" lors de l'installation d'Arch ?
- Stephen Wadeley (2014). "8. Gestion des services avec systemd" Guide de l'administrateur système Red Hat Enterprise Linux 7 . Chapeau rouge.
- Lennart Poettering (2013-10-07).
systemctl halt. pages de manuel systemd. freedesktop.org. - Lennart Poettering (2013-10-07).
systemd.special. pages de manuel systemd. freedesktop.org. - Lennart Poettering (2013-10-07).
bootup. pages de manuel systemd. freedesktop.org. - Jonathan de Boyne Pollard (2018).
init. Guide bouffe . Logiciels.