¿Cuál es la diferencia entre estos comandos para derribar un servidor Linux?

65

Lectura "¿Cuál es la diferencia entre los comandos Halt y Shutdown?" , Generalmente tengo una idea de lo que hace el comando shutdown, con o sin las opciones -h / -r.

El comando "detener" realiza el apagado del sistema para ejecutar el nivel 0 del sistema.

El comando "shutdown" apaga el sistema para ejecutar el nivel 1 sin el comando -h o -r.

¿Qué pasa con el comando "poweroff" que entra en el nivel de ejecución 0 o 1? ¿Es esta la única diferencia principal entre estos tres comandos?

Win.T
fuente
Relacionados askubuntu.com/q/578144/216503
heemayl
Estas son algunas de las cosas que difieren significativamente para, por ejemplo, Solaris y FreeBSD. (Allí, generalmente (casi) inmediatamente detienen / apagan el servidor, sin cambiar los niveles de ejecución para cerrar primero las cosas)
Gert van den Berg

Respuestas:

120

Y ahora, la respuesta del sistema.

Está utilizando, según la etiqueta de su pregunta, Red Hat Enterprise Linux. Desde la versión 7, que ha usado systemd. Ninguna de las otras respuestas son correctas para el mundo de systemd; ni siquiera son algunos de los supuestos en su pregunta.

  • Olvídate de los niveles de ejecución ; existen, pero solo como calzas de compatibilidad. La documentación de systemd establece que el concepto es "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 marcelm citó; no es del conjunto de herramientas correcto en absoluto, y es una descripción del comando de otro conjunto de herramientas, incorrecto para systemd. Es el del haltcomando de las utilidades "System 5" de Van Smoorenburg init.
  • Ignorar las declaraciones que /sbin/haltes un enlace simbólico a /sbin/reboot; Eso no es cierto con systemd. No hay ningún rebootprograma separado en absoluto.
  • No haga caso de las declaraciones que halto rebootinvocar un shutdownprograma con argumentos de línea de comandos; tampoco son ciertas con systemd. No hay ningún shutdownprograma separado en absoluto.

Cada conjunto de herramientas de administración del sistema tiene su versión de estas utilidades. systemd, advenedizo, nosh , van Smoorenburg init, BSD y inittodos tienen su propia halt, poweroffy así sucesivamente. En cada uno sus mecanismos son ligeramente diferentes. Así son sus páginas de manual.

En el conjunto de herramientas systemd halt, poweroff,reboot , telinit, y shutdownson todos los enlaces simbólicos a /bin/systemctl. Son todas las cuñas compatibilidad hacia atrás, 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 programa único . (Por convención, el shell le dice con qué nombre ha sido invocado).

objetivos, no niveles de ejecución

La mayoría de esos comandos son shorthands para decirle a systemd, usar systemctl, para aislar un objetivo particular . El aislamiento se explica en la systemctlpágina del manual (qv), pero se puede considerar, a los efectos de esta respuesta, como iniciar un objetivo y detener cualquier otro. Los objetivos estándar utilizados en systemd se enumeran en la systemd.special(8) página del manual.

Los diagramas en la bootuppágina del manual (7) en el conjunto de herramientas systemd, en particular el último, muestran que hay tres objetivos "finales" que son relevantes aquí:

  • halt.target- Una vez que el sistema ha alcanzado el estado de aislar completamente este objetivo, habrá llamado la llamada al reboot(RB_HALT_SYSTEM)sistema. El kernel habrá intentado ingresar a un programa de monitor ROM, o simplemente detuvo la CPU (utilizando cualquier mecanismo apropiado para hacerlo).
  • reboot.target- Una vez que el sistema ha alcanzado el estado de aislar completamente este objetivo, habrá llamado la llamada al reboot(RB_AUTOBOOT)sistema (o el equivalente con la línea de comando mágico). El núcleo habrá intentado activar un reinicio.
  • poweroff.target- Una vez que el sistema ha alcanzado el estado de aislar completamente este objetivo, habrá llamado la llamada al reboot(RB_POWER_OFF)sistema. El núcleo habrá intentado eliminar la energía del sistema, si es posible.

Estas son las cosas en las que debería estar pensando en los estados finales del sistema, no en los niveles de ejecución. Observe en el diagrama que el sistema de destino systemd mismo 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.targetobjetivo, de modo que uno describe los servicios que deben detenerse antes del apagado por hacer que entren en conflicto con el shutdown.targetobjetivo.

systemctlintenta enviar solicitudes a systemd-logindcuando el usuario que llama no es el superusuario. También pasa a los retrasos en los cierres systemd-shutdownd. Y algunas manos cortas activan wallnotificaciones. Dejando a un lado esas complejidades, lo que haría que esta respuesta fuera varias veces más larga, suponiendo que usted es actualmente el superusuario y no solicita una acción programada:

  • systemctl isolate halt.target tiene las manos cortas:
    • shutdown -H now
    • systemctl halt
    • simplemente sin adornos halt
  • systemctl isolate reboot.target tiene las manos cortas:
    • shutdown -r now
    • telinit 6
    • systemctl reboot
    • simplemente sin adornos reboot
  • systemctl isolate poweroff.target tiene las manos cortas:
    • shutdown -P now
    • telinit 0
    • shutdown now
    • systemctl poweroff
    • simplemente sin adornos poweroff
  • systemctl isolate rescue.target tiene las manos cortas:
    • telinit 1
    • systemctl rescue
  • systemctl isolate multi-user.target tiene las manos cortas:
    • telinit 2
    • telinit 3
    • telinit 4
  • systemctl isolate graphical.target tiene la taquigrafía:
    • telinit 5

Después de analizar las diferentes sintaxis de línea de comandos, todas estas terminan en las mismas rutas de código dentro del systemctlprograma.

Notas:

  • El comportamiento tradicional de la opción sin opciones shutdown nowha 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 con el shutdowncomando.
  • telinit realmente ignora por completo todos esos y enlaces simbólicos en el sistema de archivos que describen las páginas del manual. Las asignaciones anteriores están cableadas al programa, en una tabla.runlevelN.targetdefault.targetsystemctl
  • systemd no tiene noción de un nivel de ejecución actual . El funcionamiento de estos comandos no está condicionado a ningún "si está en el nivel de ejecución N ".
  • La --forceopción de la halt, rebooty poweroffcomandos es lo mismo que decir --force --forcea los systemctl halt, systemctl rebooty systemctl powerofflos comandos. Esto hace que systemctlintente llamar reboot()directamente. Normalmente solo trata de aislar objetivos.
  • telinitNo es lo mismo que init. Son programas diferentes en el mundo systemd, siendo este último otro nombre para el systemdprograma, no para el systemctlprograma. El systemdprograma no está necesariamente compilado con ninguna compatibilidad de Van Smoorenburg, y en algunos sistemas operativos systemd se queja de ser invocado incorrectamente si se intenta .init N

Otras lecturas

JdeBP
fuente
1
Esto es muy genérico para la mayoría de los sistemas Linux modernos, por lo que, por ejemplo, responde wiert.me/2012/12/30/... Después de todos estos años preguntándome, finalmente entiendo lo que está sucediendo y por qué.
Jeroen Wiert Pluimers
systemctl rebootdebe ser equivalente a systemctl start reboot.target --job-mode=replace-irreversible. Usar cualquier otro modo de trabajo es menos robusto. unix.stackexchange.com/questions/381739/…
sourcejedi
1
Leí toda tu respuesta y absorbí lo que pude. Queda una pregunta, la misma por la que vine aquí, ¿es systemctl rebootla forma "segura" de reiniciar, por ejemplo, init 6cuál es la forma en que de otro modo sería seguro reiniciar?
Brian Thomas
25
  • haltindica al hardware que detenga todas las funciones de la CPU , pero lo deja en estado encendido. Esto generalmente significa que alguien tiene que reiniciar o apagar la máquina manualmente presionando el botón de encendido después. La forma específica de lograr esto es específica de la arquitectura, pero, por ejemplo, el conjunto de instrucciones x86 proporciona las HLTinstrucciones que detienen la unidad central de procesamiento (CPU) hasta que se dispara la próxima interrupción externa.

  • poweroff, como halt, detiene la CPU pero también envía una señal de hardware ACPI que indicará al sistema que comience con un apagado completo e inmediato. Esto es aproximadamente equivalente a presionar el botón de encendido en una computadora de escritorio típica.

Ambos halty poweroffgeneralmente son enlaces simbólicos al rebootejecutable, que generalmente invocará la shutdownherramienta con los argumentos apropiados ( -h, -Po r) dependiendo de si halt, poweroffo rebootse usó para invocar la herramienta. Sin embargo, cuando --forcese pasa la opción a reboot, o cuando está en el nivel de ejecución 0 o 6, rebootinvocará la reboot()llamada del sistema con un código de comando apropiado.

Thomas Nyman
fuente
Thomas, muchas gracias por explicarlo. Estoy interesado en saber qué pasa con hacer un #init 0, no hay muchas diferencias, ¿verdad?
Win.T
@ Win.T Cambiar al nivel de ejecución 0 usando, por ejemplo, /sbin/init 0o /sbin/telinit 0debería ser lo mismo que detener el sistema, aunque los pasos específicos que se tomen dependerían del sistema init en cuestión, como System-V init , upstart o systemd . Si está ejecutando RHEL, estaría utilizando systemd.
Thomas Nyman
44
Nota personal: cada vez que alguien se queje de una llamada API Win32 arcana, muéstrele reiniciar (2).
user253751
@immibis Pero reiniciar es deliberadamente arcano. Requiere las banderas mágicas para que sea muy difícil hacerlo por accidente.
Kevin Cox
44
@KevinCox Ese es el argumento para requerir banderas mágicas. No es el argumento para aceptar 4 valores diferentes para magic2, ni para comportarse de manera diferente dentro de un espacio de nombres PID, ni para agrupar varias operaciones apenas relacionadas (como configurar el comportamiento de reinicio-en-Ctrl-Alt-Eliminar) en una función.
user253751
1

halt, poweroffy shutdown -hson completamente equivalentes. De hecho, detener y apagar no hacen más que llamar shutdown -h. Desde la página de manual de alto / apagado:

Si se llama a detener o reiniciar cuando el sistema no está en el nivel de ejecución 0 o 6, en otras palabras, cuando se ejecuta normalmente, se invoca el apagado en su lugar (con el indicador -h o -r). Para obtener más información, consulte la página de manual de shutdown (8).

El apagado luego procede a apagar el sistema cambiando al nivel de ejecución 0.

Detener y apagar (y reiniciar) desempeñan un doble papel; cuando se ejecutan en el proceso de apagado (es decir, en el nivel de ejecución 0 o 6), realizan las operaciones de bajo nivel requeridas para detener físicamente, apagar o reiniciar la máquina, como se describe en otra respuesta.

marcelm
fuente
2
¿Qué versión de RHEL estás usando? Normalmente hay una diferencia entre detener y apagar (aunque por un tiempo no solía ser el caso en muchas distribuciones, pero eso fue un error).
Bruno