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
halt
commande de van Smoorenburg "System 5"init
utilitaires. - Ignorez les instructions qui
/sbin/halt
est un lien symbolique vers/sbin/reboot
; ce n'est pas vrai avec systemd. Il n'y a pas dereboot
séparé programme du tout. - Ignorer les instructions qui
halt
oureboot
invoquer unshutdown
programme avec des arguments de ligne de commande ; ils ne sont pas non plus vrais avec systemd. Il n'y a pas d'shutdown
sé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.target
a les raccourcis :shutdown -H now
systemctl halt
halt
simple sans fioritures
systemctl isolate reboot.target
a les raccourcis :shutdown -r now
telinit 6
systemctl reboot
reboot
sans fioritures
systemctl isolate poweroff.target
a les raccourcis :shutdown -P now
telinit 0
shutdown now
systemctl poweroff
poweroff
simple sans fioritures
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 se retrouvent toutes dans les mêmes chemins de code à l'intérieur du systemctl halt
programme.
Remarques :
- Le comportement traditionnel de l'
shutdown now
sans 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 leshutdown
commande. telinit
fait vraiment ignorer complètement tous cesrunlevelN.target
etdefault.target
liens symboliques dans le système de fichiers que les pages de manuel décrivent. Les mappages ci-dessus sont câblés dans lesystemctl halt
programme, 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
--force
l'optionhalt
,reboot
, etpoweroff
commandes revient à dire--force --force
à l'arrêtsystemctl halt
,systemctl reboot
, etsystemctl poweroff
commandes. Cela rendsystemctl halt
essayez d'appelerreboot()
directement. 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 lesystemd
programme, pas pour lesystemctl halt
programme. Lesystemd
le 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.