Leer "¿Cuál es la diferencia entre los comandos Halt y Shutdown?" , generalmente tengo una idea de lo que hace el comando de apagado, con o sin las opciones -h/-r.
El comando "detener" realiza el apagado del sistema al nivel de ejecución 0 del
sistema.
El comando "apagar" realiza un apagado del sistema al nivel de ejecución
1 sin el comando -h o -r.
¿Qué sucede con el comando "apagar" si entra en el nivel de ejecución 0 o 1?
¿Es esta la única diferencia principal entre estos tres comandos?
Respuesta aceptada:
Y ahora, la respuesta systemd.
Está utilizando, según la etiqueta de su pregunta, Red Hat Enterprise Linux. Desde la versión 7, que ha utilizado systemd. Ninguna de las otras respuestas es correcta para el mundo de systemd; ni siquiera lo son algunas de las suposiciones en su pregunta.
- Olvídate de los niveles de ejecución; existen, pero solo como cuñas de compatibilidad. La documentación de systemd establece que el concepto está "obsoleto". Si está comenzando a aprender estas cosas en un sistema operativo systemd, no comience allí.
- Olvídate de la página del manual que citó marcelm; no es del conjunto de herramientas adecuado y es una descripción del comando de otro conjunto de herramientas, incorrecto para systemd. Es el de la
halt
comando desde el van Smoorenburg “Sistema 5”init
utilidades. - Ignore las declaraciones que
/sbin/halt
es un enlace simbólico a/sbin/reboot
; eso no es cierto con systemd. No hay unreboot
separado programa en absoluto. - Ignore las declaraciones que
halt
oreboot
invocar unshutdown
programa con argumentos de línea de comandos; tampoco son ciertos con systemd. No hay unshutdown
separado programa en absoluto.
Cada conjunto de herramientas de administración del sistema tiene su versión de estas utilidades. systemd, advenedizo, nosh, van Smoorenburg init
y BSD init
todos tienen su propio halt
, poweroff
, Etcétera. En cada uno su mecánica es ligeramente diferente. También lo son sus páginas de manual.
En el conjunto de herramientas systemd halt
,poweroff
,reboot
, telinit
y poweroff
son todos enlaces simbólicos a /bin/systemctl
. Son todos correcciones de compatibilidad con versiones anteriores, que son simplemente abreviaturas para invocar la interfaz de línea de comandos principal de systemd:systemctl
. Todos se asignan a (y de hecho son) ese mismo único programa. (Por convención, el shell le dice qué nombre lo ha invocado).
objetivos, no niveles de ejecución
La mayoría de esos comandos son abreviaturas para decirle a systemd, usando systemctl
, para aislar un objetivo particular . El aislamiento se explica en systemctl
página del manual (qv), pero puede ser, para los propósitos de esta respuesta, considerado como iniciar un objetivo y detener cualquier otro. Los objetivos estándar utilizados en systemd se enumeran en systemd.special
(8) página del manual.
Los diagramas en el bootup
(7) página de manual en el conjunto de herramientas systemd, en particular la última, muestra que hay tres objetivos "finales" que son relevantes aquí:
halt.target
— Una vez que el sistema haya alcanzado el estado de aislamiento total de este objetivo, habrá llamado alreboot(RB_HALT_SYSTEM)
llamada del sistema. El núcleo habrá intentado ingresar a un programa de monitoreo de ROM, o simplemente detuvo la CPU (usando cualquier mecanismo que sea apropiado para hacerlo).reboot.target
— Una vez que el sistema haya alcanzado el estado de aislamiento total de este objetivo, habrá llamado alreboot(RB_AUTOBOOT)
llamada al sistema (o el equivalente con la línea de comando mágica). El núcleo habrá intentado activar un reinicio.poweroff.target
— Una vez que el sistema haya alcanzado el estado de aislamiento total de este objetivo, habrá llamado alreboot(RB_POWER_OFF)
llamada del sistema. El núcleo habrá intentado eliminar la energía del sistema, si es posible.
Estos son las cosas en las que debe pensar como establece el sistema final, no en los niveles de ejecución. Observe en el diagrama que el propio sistema de destino systemd codifica cosas que, en otros sistemas, son implícitas en lugar de explícitas:como la noción de que cada uno de estos objetivos finales abarca el shutdown.target
objetivo, de modo que uno describa los servicios que deben detenerse antes de apagarlos haciendo que entren en conflicto con el poweroff.target
objetivo.
systemctl
intenta enviar solicitudes a systemd-logind
cuando el usuario que llama no es el superusuario. También pasa los apagados retrasados a systemd-shutdownd
. Y algunas abreviaturas activan wall
notificaciones Dejando a un lado esas complejidades, lo que haría que esta respuesta fuera varias veces más larga, suponiendo que actualmente sea el superusuario y no solicite una acción programada:
systemctl isolate halt.target
tiene las abreviaturas:shutdown -H now
systemctl halt
- sin adornos
halt
systemctl isolate reboot.target
tiene las abreviaturas:shutdown -r now
telinit 6
systemctl reboot
- sin adornos
reboot
systemctl isolate poweroff.target
tiene las abreviaturas:shutdown -P now
telinit 0
shutdown now
systemctl poweroff
- sin adornos
poweroff
systemctl isolate rescue.target
tiene las abreviaturas:telinit 1
systemctl rescue
systemctl isolate multi-user.target
tiene las abreviaturas:telinit 2
telinit 3
telinit 4
systemctl isolate graphical.target
tiene la abreviatura:telinit 5
Después de analizar las diferentes sintaxis de la línea de comandos, finalmente terminan en las mismas rutas de código dentro de systemctl
programa.
Notas:
- El comportamiento tradicional de
shutdown now
sin opciones ha sido cambiar al modo de usuario único . Este no es el caso con systemd.rescue.target
— el modo de usuario único se renombra como modo de rescate en systemd:no se puede acceder conshutdown
comando. telinit
realmente lo hace ignorar por completo todos esosrunlevelN.target
ydefault.target
enlaces simbólicos en el sistema de archivos que describen las páginas del manual. Las asignaciones anteriores están integradas en elsystemctl
programa, en una tabla.- systemd no tiene noción de un nivel de ejecución actual . La operación de estos comandos no está condicionada a ningún "si está en el nivel de ejecución N “.
- La
--force
opción alhalt
,reboot
ypoweroff
comandos es lo mismo que decir--force --force
alsystemctl halt
,systemctl reboot
ysystemctl poweroff
comandos Esto hace quesystemctl
intenta llamar areboot()
directamente. Normalmente solo trata de aislar objetivos. telinit
no es lo mismo queinit
. Son diferentes programas en el mundo systemd, siendo este último otro nombre para elsystemd
programa, no para elsystemctl
programa. Elsystemd
El programa no está necesariamente compilado con ninguna compatibilidad de van Smoorenburg, y en algunos sistemas operativos systemd se queja de que se invoca incorrectamente si se intentainit N
.
Lecturas adicionales
- ¿Hay alguna buena razón para detener el sistema sin cortar la energía?
- ¿Por qué `init 0` da como resultado "Argumentos en exceso" en la instalación de Arch?
- Stephen Wadeley (2014). “8. Administración de servicios con systemd” Guía del administrador del sistema Red Hat Enterprise Linux 7 . Sombrero rojo.
- Lennart Poettering (2013-10-07).
systemctl
. páginas del manual systemd. freedesktop.org. - Lennart Poettering (2013-10-07).
systemd.special
. páginas del manual systemd. freedesktop.org. - Lennart Poettering (2013-10-07).
bootup
. páginas del manual systemd. freedesktop.org. - Jonathan de Boyne Pollard (2018).
init
. Guía de comida . Software.