Ir al contenidoIr a la navegación de la página: página anterior [tecla de acceso p]/página siguiente [tecla de acceso n]
documentation.suse.com / Introducción a los conceptos básicos de systemd

Introducción a los conceptos básicos de systemd

Fecha de publicación: 12 Dic 2024
DESCRIPCIÓN

systemd se utiliza para gestionar los ajustes y los servicios del sistema. systemd organiza las tareas en componentes denominados unidades y los grupos de unidades en destinos.

INTENCIÓN

Conocer los conceptos básicos de systemd, que incluyen funciones esenciales como la gestión de servicios, el seguimiento de dependencias, el registro, la gestión de recursos, la activación de sockets y el control del sistema.

ESFUERZO

20 minutos de lectura.

REQUISITOS
  • Conocimientos básicos de los comandos de Linux

  • Conocimientos básicos de los procesos, daemons y grupos de control de Linux

1 ¿Qué es systemd?

systemd es un gestor del sistema y de servicios para sistemas operativos Linux. Es el sistema de inicialización por defecto para las principales distribuciones de Linux. El usuario no inicia directamente systemd, sino que se instala mediante /sbin/init y se inicia durante el arranque inicial. cuando se ejecuta como el primer proceso de arranque (PID 1), systemd actúa como el sistema init que activa y mantiene los servicios de espacio de usuario. El PID 1 se conoce como init y es el primer proceso del modo de usuario de Linux que se crea. Se ejecuta hasta que se apaga el sistema.

PID 1 pertenece a systemd y se inicia directamente desde el kernel. Todos los demás procesos los inicia directamente systemd o uno de sus subprocesos. systemd monta el sistema de archivos del host y gestiona los archivos temporales. Es retrocompatible con los guiones init de SysV. SysV es un sistema de inicialización anterior a systemd.

En systemd, una unidad es un recurso que el sistema sabe cómo operar y gestionar. Este es el objeto principal que utilizan las herramientas systemd. Estos recursos se definen con archivos de configuración denominados archivos de unidad.

systemctl es la herramienta de gestión central para controlar el sistema init. Se utiliza para examinar y controlar el estado del gestor del sistema y de servicios systemd.

En systemd, los destinos son grupos de unidades relacionadas que actúan como puntos de sincronización durante el arranque del sistema. Los archivos de unidad de destino tienen la extensión de archivo .target. Las unidades de destino agrupan varias unidades systemd a través de una cadena de dependencias.

Para la resolución de problemas, puede utilizar journalctl, que se emplea para consultar y mostrar mensajes de registro del diario systemd.

Para obtener más información sobre systemd, puede consultar https://systemd.io y man 1 systemd.

2 Acerca del proceso de arranque de systemd

El primer paso del proceso de arranque es cargar el kernel de Linux, que es el componente principal del sistema operativo Linux. Una vez que se carga el kernel, inicializa el hardware e inicia el proceso systemd, que es el primer proceso que se ejecuta en el sistema.

2.1 Proceso de arranque de Linux

El proceso de arranque de Linux es la etapa inicial del inicio del sistema operativo. En él, el sistema operativo carga la memoria, inicializa los componentes y se prepara para ejecutar las aplicaciones de usuario.

El proceso de arranque de Linux se divide en cuatro fases principales:

Fase 1: BIOS

Cuando enciende el equipo, este inicia el BIOS (sistema básico de entrada/salida) y realiza una prueba POST (autoprueba de encendido). Se trata de una comprobación de integridad que sondea la funcionalidad del hardware de componentes como discos duros, SSD, teclado, RAM, puertos USB y cualquier otro hardware. Si el hardware funciona como se espera, el proceso de arranque pasa a la siguiente fase.

Fase 2: el cargador de arranque

Una vez finalizada la POST, el BIOS busca y carga el programa del cargador de arranque almacenado en el MBR (registro de arranque principal). El MBR es un código de 512 bytes que normalmente se encuentra en /dev/sda o en /dev/hda, en función de la arquitectura del disco duro. El MBR también se puede ubicar en una unidad de USB o de DVD de Linux. El BIOS carga y ejecuta este código de MBR.

Hay tres cargadores de arranque principales en Linux: LILO, GRUB y GRUB2. El cargador de arranque GRUB2 (Grand Unified Bootloader) es el principal y el más reciente de las distribuciones Linux modernas. El archivo de configuración de GRUB2 está ubicado en /boot/grub2/grub2.cfg. Una vez que el BIOS localiza el cargador de arranque GRUB2, lo ejecuta y lo carga en la memoria principal (RAM).

Fase 3: inicialización del kernel de Linux

El kernel de Linux es el corazón del sistema operativo. En el sistema Linux, el kernel interactúa con el hardware, controla la gestión de la memoria y gestiona los procesos. El cargador de arranque carga el kernel de Linux seleccionado. El kernel se extrae automáticamente de una versión comprimida y monta el sistema de archivos raíz. A continuación, ejecuta el programa /sbin/init.

Fase 4: systemd

El kernel carga systemd, que es un gestor del sistema y de servicios para los sistemas operativos Linux. A continuación, systemd ejecuta todos los demás procesos de inicialización.

2.2 Proceso de arranque con systemd

Una vez que el kernel carga systemd, systemd toma el control e inicia los demás servicios del sistema necesarios para ponerlo en funcionamiento. Esto incluye servicios como el servicio de red, el gestor de inicio de sesión, etc.

El proceso de arranque se paraleliza en el orden en que se ejecutan las unidades de destino específicas. systemd utiliza el archivo /etc/systemd/system/default.target para determinar el destino en el que debe arrancar el sistema Linux. Este archivo es un enlace a graphical.target que arranca el gestor de inicio de sesión gráfica. systemd activa todas las unidades de destino que son dependencias de default.target, así como, de forma recurrente, todas las dependencias de estas dependencias. Una vez iniciados todos los servicios, el sistema estará listo para utilizarse y aparecerá el gestor de inicio de sesión. Ahora puede iniciar sesión y empezar a utilizar el sistema.

2.3 Análisis del rendimiento del proceso de arranque del sistema con el comando systemd-analyze

Utilice el comando systemd-analyze para analizar el rendimiento del proceso de arranque del sistema. El comando también se puede utilizar para recuperar otra información de estado y seguimiento del gestor del sistema y de servicios. Se utiliza para comprobar que los archivos de unidad son correctos y también para acceder a funciones especiales útiles para la depuración avanzada del gestor del sistema.

Algunos ejemplos son:

Visualización del tiempo que tarda el sistema en arrancar
> systemd-analyze time
Startup finished in 3.404s (kernel) + 2.415s (initrd) + 13.125s (userspace) = 18.945s
graphical.target reached after 13.117s in userspace
Obtención de una descripción general de alto nivel del proceso de arranque, que incluye los servicios que se inician y el tiempo que tarda cada servicio en iniciarse
> systemd-analyze critical-chain
  The time when unit became active or started is printed after the "@" character.
  The time the unit took to start is printed after the "+" character.

  graphical.target @13.117s
  └─multi-user.target @13.117s
    └─getty.target @13.117s
      └─getty@tty1.service @13.116s
        └─plymouth-quit-wait.service @10.775s +2.338s
          └─systemd-user-sessions.service @10.769s +3ms
            └─remote-fs.target @10.764s
              └─iscsi.service @10.747s +16ms
                └─network-online.target @10.744s
                  └─NetworkManager-wait-online.service @1.547s +9.197s
                    └─NetworkManager.service @1.507s +37ms
                      └─network-pre.target @1.504s
                        └─wpa_supplicant.service @2.341s +5ms
                          └─dbus.service @1.042s
                            └─basic.target @1.036s
                              └─sockets.target @1.036s
                                └─snapd.socket @1.035s +590us
                                  └─sysinit.target @1.030s
                                    └─systemd-update-utmp.service @1.025s +5ms
                                      └─auditd.service @976ms +47ms
                                        └─systemd-tmpfiles-setup.service @964ms +9ms
                                          └─local-fs.target @962ms
                                            └─snapd.mounts.target @961ms
                                              └─snap-core18-2796.mount @417ms +543ms
                                                └─dev-loop9.device @961ms +628us

Este comando imprime un árbol de unidades de tiempo crítico para cada una de las unidades especificadas o para el destino por defecto. La inicialización de los servicios puede depender de la activación del socket y de la ejecución paralela de las unidades. Al igual que el comando blame, muestra el tiempo que tarda una unidad en activarse, que no está definido para unidades como las de dispositivo que pasan directamente al estado activo.

Visualización de una lista de servicios iniciados durante el proceso de arranque y mostrados según el tiempo que tarda cada servicio
> systemd-analyze blame
  9.197s NetworkManager-wait-online.service
  4.002s fwupd.service
  2.338s plymouth-quit-wait.service
  1.282s dracut-pre-udev.service
  1.062s sys-devices-platform-serial8250-tty-ttyS0.device
  1.062s dev-ttyS0.device
  1.061s dev-ttyS1.device
  1.061s sys-devices-platform-serial8250-tty-ttyS1.device
  1.060s dev-ttyS11.device
  1.060s sys-devices-platform-serial8250-tty-ttyS11.device
  1.059s sys-devices-platform-serial8250-tty-ttyS13.device
  1.059s dev-ttyS13.device
  1.059s sys-devices-platform-serial8250-tty-ttyS10.device
  1.059s dev-ttyS10.device
  1.058s sys-devices-platform-serial8250-tty-ttyS14.device
  1.058s dev-ttyS14.device
  1.058s dev-ttyS12.device
  1.058s sys-devices-platform-serial8250-tty-ttyS12.device
  1.056s sys-devices-platform-serial8250-tty-ttyS17.device

La inicialización de un servicio puede ser lenta porque esté esperando a que se complete la inicialización de otro. Muestra el tiempo que tarda una unidad en activarse, que no está definido para unidades como las de dispositivo que pasan directamente al estado activo. Este comando no muestra los resultados de los servicios con Type=simple, porque systemd considera que estos servicios se inician inmediatamente, por lo que no se pueden analizar los retrasos de inicialización.

Generación de un archivo de gráficos vectoriales que muestra los eventos que tienen lugar durante el proceso de arranque
> systemd-analyze plot > /temp/sample.svg

Este comando crea un archivo SVG en el directorio temp. El archivo SVG es un archivo de texto que define un conjunto de vectores gráficos que utilizan aplicaciones como LibreOffice Draw para generar un gráfico.

3 Estructura de un archivo de unidad

En systemd, una unidad hace referencia a cualquier recurso que el sistema sabe cómo operar y gestionar. Este es el objeto principal que utilizan las herramientas systemd. Estos recursos se definen mediante archivos de configuración denominados archivos de unidad. A la hora de trabajar con systemd, la administración es más fácil cuando se comprenden los archivos de unidad. Los archivos de unidad utilizan una sintaxis declarativa simple que permite ver fácilmente el propósito y los efectos de una unidad al activarse. Los archivos de unidad tienen secciones con directivas, por ejemplo:

[Section]
Directive1=value
Directive2=value
. . .

Los tipos de archivos de unidad incluyen las siguientes secciones:

[Unit]

La primera sección que se encuentra en la mayoría de los archivos de unidad es [Unit]. Esta sección se utiliza para definir los metadatos del archivo de unidad y configurar la relación del archivo de unidad con otros archivos de unidad. Esta sección se suele colocar en la parte superior porque proporciona una descripción general del archivo de unidad.

[Automount] / [Mount] / [Path] / [Service] / [Slice] / [Socket] /[Swap] / [Timer]

Estas secciones contienen directivas específicas para su tipo respectivo. Consulte la Sección 4, “Tipos de archivos de unidad” para obtener una lista de los tipos disponibles. Tenga en cuenta que los tipos device, target, snapshot y scope no tienen una sección específica de tipo.

[Install]

Suele ser la última sección del archivo de unidad y es opcional. Se utiliza para definir el comportamiento de un archivo de unidad cuando está habilitado o inhabilitado. Cuando se habilita un archivo de unidad, se inicia automáticamente al arrancar. Según la unidad específica, podría haber una dependencia en otras unidades relacionadas necesaria para funcionar correctamente. Por ejemplo, chrony requiere las directivas After, Wants y Before, que son todas las dependencias con las que tiene que trabajar chrony.

Ejemplo 1: Un archivo de servicio systemd
[Unit]
Description=usbguard 1

[Service]
ExecStart=/usr/sbin/usb-daemon 2

[Install]
WantedBy=multi-user.target 3

1

Una breve descripción de la finalidad del archivo de servicio.

2

Especifica el programa que se debe ejecutar cuando se inicia el servicio.

3

Inicia un sistema multiusuario con conectividad y sin entorno gráfico. Esta directiva permite especificar una relación de dependencia.

4 Tipos de archivos de unidad

Puede determinar el tipo de unidad según su extensión de archivo. systemd clasifica las unidades según el tipo de recurso que describen.

Tipos de archivos de unidad disponibles para systemd:

.service

Describe cómo gestionar un servicio o una aplicación. Esto incluye cómo iniciar o detener el servicio, volver a cargar su archivo de configuración (si procede), en qué condiciones se inicia el servicio automáticamente y la información de dependencia o jerarquía de los archivos de unidad relacionados.

.scope

Este archivo de unidad lo crea automáticamente systemd a partir de la información recibida de la interfaz D-Bus y se utiliza para gestionar conjuntos de procesos del sistema que se crean externamente.

.path

Define una vía para la activación basada en vías. Por defecto, se activa un archivo de unidad .service con el mismo nombre base. inotify es una API del kernel que utilizan los programas que desean recibir notificaciones sobre cambios en los archivos.

.snapshot

El comando systemctl snapshot crea automáticamente un archivo de unidad .snapshot. Este comando crea instantáneas temporales del estado actual del sistema. Puede modificar el estado actual del sistema después de realizar cambios. Las instantáneas se utilizan para deshacer estados temporales.

.timer

Define un temporizador gestionado por systemd. Esto es similar a una trabajo cron para la activación programada o retrasada. Un archivo de unidad con el mismo nombre, pero con la extensión de archivo .service se inicia cuando se alcanza el temporizador.

.slice

Asocia nodos de grupo de control de Linux, que permiten asignar o restringir recursos a cualquier proceso asociado con el segmento. El nombre indica la jerarquía dentro del árbol del grupo de control. Las unidades se colocan en sectores por defecto en función de su tipo.

.target

Proporciona sincronización para otras unidades durante el arranque o un cambio de estado, o lleva el sistema a un nuevo estado. Otras unidades especifican su relación con los destinos para sincronizarse con las operaciones del destino.

.socket

Describe una red, un zócalo IPC o un búfer FIFO que systemd utiliza para la activación basada en zócalos. Hay un archivo .service asociado que se inicia cuando se ve una actividad en el zócalo que define esta unidad.

.device

Define un dispositivo que ha sido designado para la gestión de systemd por udev o un sistema de archivos sysfs. No todos los dispositivos tienen el archivo .device. Este archivo de unidad es necesario para realizar pedidos, montar un dispositivo o acceder a uno.

.swap

Define el espacio de intercambio en el sistema. El nombre del archivo de unidad debe reflejar el dispositivo o la vía de archivo del espacio.

.mount

Define un punto de montaje en el sistema que debe gestionar systemd. Este archivo recibe el nombre de la vía de montaje y las barras inclinadas se convierten en guiones. Las entradas incluidas en /etc/fstab pueden tener unidades creadas automáticamente.

.automount

Define un punto de montaje que se monta automáticamente. Nombra el archivo según el punto de montaje al que hace referencia. Se requiere un archivo de unidad .mount que coincida para definir los detalles del montaje.

5 Dependencias y orden de las unidades

systemd tiene dos tipos de dependencias: dependencias de requisitos y de orden. Las dependencias de requisitos especifican qué otras unidades deben estar iniciadas o detenidas al activar una unidad. Las dependencias de orden especifican el orden en el que se deben iniciar las unidades.

Dependencias de la unidad

Los archivos de unidad tienen la función de dependencias. Una unidad puede pedir a otras unidades que se ejecuten (want) o puede requerir (require) que haya otras unidades en ejecución para poder ejecutarse. Estas dependencias se definen en archivos de unidad con las directivas Wants y Requires.

Wants

Por ejemplo, si la unidad A tiene Wants=unit B, cuando se ejecuta la unidad A, también se ejecuta la unidad B. Pero da igual si la unidad B se inicia correctamente o no para que la unidad A se ejecute correctamente.

Requires

Si la unidad A tiene Requires=unit B, ambas unidades se ejecutan, pero si la unidad B no lo hace correctamente, la unidad A se desactiva. No importa si los procesos de la unidad A se estaban ejecutando correctamente.

Orden de las unidades

systemd puede ejecutar un grupo de unidades al mismo tiempo, pero iniciar los servicios en el orden correcto es importante para el buen funcionamiento del sistema Linux. Puede organizar el orden con las directivas de archivo de unidad Before y After.

Before

Por ejemplo, si la unidad A tiene Before=unit B, cuando se ejecutan ambas unidades, la unidad A se ejecuta completamente antes que la unidad B.

After

Si la unidad A tiene After=unit B, cuando ambas unidades se ejecutan, la unidad B se ejecuta completamente antes que la unidad A.

6 Registro

Los archivos de registro y los diarios son importantes para la administración del sistema. Proporcionan información detallada sobre un sistema y son muy importantes para la resolución de problemas y la auditoría. Los archivos de registro contienen eventos y mensajes generados por el kernel, las aplicaciones y los usuarios que inician sesión en el sistema. Puede utilizar el comando journalctl para consultar el diario. Este comando muestra los registros recopilados por systemd. El servicio systemd-journald gestiona la recopilación de registros de systemd. systemd-journald guarda los eventos y los mensajes en formato binario.

7 Destinos de systemd

systemd utiliza unidades y destinos. Una unidad de systemd define un servicio o una acción en el sistema, que consta de un nombre, un tipo y un archivo de configuración. Un destino de systemd combina varias unidades y define qué servicios deben iniciarse para alcanzar el destino. En un servidor, por ejemplo, se trata de un estado en el que la red se está ejecutando y varios usuarios pueden iniciar sesión. Estos archivos se identifican mediante el sufijo .target.

Al igual que en los archivos de unidad, los distintos destinos se pueden anidar mediante dependencias. Por ejemplo, multi-user.target requiere (entre otros) los destinos que configuran los servicios de inicio de sesión y de sesión de usuario.

Destinos de systemd comunes:

default.target

Arranca por defecto. El archivo default.target es un enlace simbólico al archivo de destino real, por ejemplo graphical.target para una estación de trabajo de escritorio. Para un servidor, normalmente es graphical.target.

poweroff.target

Apaga y desactiva el sistema.

rescue.target

La unidad de destino que extrae el sistema base e inicia una sesión de shell de rescate.

multi-user.target

Configura un sistema multiusuario no gráfico (consola).

graphical.target

Utiliza un sistema gráfico multiusuario con servicios de red.

reboot.target

Apaga y rearranca el sistema.

Para obtener más información sobre los destinos de systemd, consulte las páginas man 5 systemd.target y man 7 systemd.special.

8 Uso de systemd como usuario normal

Puede utilizar systemd como usuario normal para mejorar la seguridad o cuando no tenga privilegios de usuario root. La ejecución de un servicio sin privilegios se puede realizar creando un servicio de user.

Al crear y utilizar un servicio de usuario, tenga en cuenta lo siguiente:

  • Las sesiones de los servicios de usuario finalizan cuando finaliza la sesión del usuario. Esto se puede anular mediante el comando loginctl enable-linger USERNAME.

  • Los archivos del servicio de usuario se encuentran en /etc/systemd/user o en $HOME/.config/systemd/user/.

  • Puede controlar los servicios de usuario con el comando systemctl --user.

9 Comandos de systemctl

El comando systemctl se utiliza para examinar y controlar el estado de systemd y del gestor de servicios.

Puede utilizar los siguientes comandos systemctl comunes y consultar la página man systemctl.

9.1 Visualización de información de systemd

Para ver información acerca de los componentes de systemd, puede utilizar los siguientes comandos:

systemctl list-units

Muestra las unidades systemd. Puede utilizar los argumentos opcionales: ‑‑state=running para mostrar las unidades activas y --type=service para mostrar las unidades de las que se ha salido y las activas.

systemctl list-unit-files

Muestra las unidades de systemd y el estado, como estática, generada, inhabilitada, alias, enmascarada y habilitada.

systemctl list-dependencies

Muestra el árbol de dependencias.

systemctl list-dependencies UNIT_FILE

Muestra las dependencias de un archivo de unidad.

9.2 Gestión de servicios de systemd

El comando systemctl permite realizar las siguientes tareas con los servicios.

systemctl status SERVICE

Comprueba el estado del servicio específico.

systemctl show SERVICE

Muestra la información del servicio.

systemctl start SERVICE

En lugar de iniciar manualmente el servicio, se usa el comando start. Cuando se realiza un cambio en el archivo de configuración, el servicio relacionado debe iniciarse de nuevo.

systemctl stop SERVICE

Detiene un servicio específico en ejecución.

systemctl restart SERVICE

En lugar de reiniciar manualmente el servicio, se usa el comando restart. Cuando se realiza un cambio en el archivo de configuración, el servicio relacionado debe reiniciarse de nuevo.

systemctl enable SERVICE

Habilita el servicio al arrancar.

systemctl disable SERVICE

Inhabilita el servicio al arrancar.

systemctl reload-or-restart SERVICE

Vuelve a cargar el servicio si admite la recarga; de lo contrario, reinicia el servicio. Si el servicio no se está ejecutando, se reinicia.

systemctl mask SERVICE

Cuando un servicio está enmascarado, significa que el archivo de unidad está enlazado simbólicamente a /dev/null. Se crea un enlace simbólico para un servicio enmascarado desde /etc/systemd/system que señala a /dev/null. Esto hace que sea imposible cargar el servicio incluso si otro servicio habilitado lo requiere. Debe detenerse manualmente o continuará ejecutándose en segundo plano. Puede utilizar la opción --runtime para enmascararlo solo temporalmente hasta el siguiente rearranque del sistema.

Created symlink /etc/systemd/system/FOSSLinux.service → /dev/null.
systemctl unmask SERVICE

Desenmascara el servicio. Es efectivo cuando el sistema se inicia o reinicia manualmente.

9.3 Gestión de estados del sistema

El comando systemctl permite realizar procesos de gestión de energía en el sistema, como reiniciar, apagar, etc., como se describe a continuación.

systemctl reboot

Rearranca el sistema reboot.target.

systemctl poweroff

Apaga el sistema poweroff.target.

systemctl emergency

Entra en el modo de emergencia emergency.target.

systemctl default

Vuelve al destino por defecto multi-user.target.

10 Resolución de problemas de systemd

Puede utilizar las siguientes sugerencias de resolución de problemas para identificar y resolver problemas con los servicios de systemd y garantizar un funcionamiento sin problemas del sistema.

Compruebe la sintaxis del archivo de unidad systemd con systemd-analyze verify SERVICE

Antes de iniciar o habilitar un servicio systemd, compruebe la sintaxis del archivo de unidad para asegurarse de que no hay errores. Por ejemplo:

> sudo systemd-analyze verify /etc/systemd/system/my-custom-service.service

El comando analiza el archivo de unidad e informa de los errores de sintaxis, los archivos que faltan u otros problemas. Debe solucionar los problemas notificados antes de habilitar e iniciar el servicio.

Compruebe los registros de su servicio con el comando journalctl -u SERVICE

Si experimenta algún problema con un servicio systemd, consulte el registro del servicio. Por ejemplo:

> sudo  journalctl -u my-custom-service.service

El comando muestra los registros del servicio especificado, incluidos los mensajes de error, las advertencias u otra información relevante. Puede utilizar estos registros para identificar y solucionar problemas con el servicio.

Utilice el comando systemd-analyze plot para visualizar el proceso de arranque

Si un servicio está causando problemas durante el proceso de arranque, puede utilizar systemd-analyze plot command para visualizar el proceso de arranque e identificar problemas. Por ejemplo:

> sudo systemd-analyze plot > boot-plot.svg

El comando crea un archivo SVG denominado boot-plot.svg que contiene una representación gráfica del proceso de arranque y los posibles problemas. Esto incluye la hora de inicio y finalización de cada servicio. Puede abrir este archivo en un visor de imágenes compatible con SVG o en un navegador Web para analizar los servicios que están causando problemas durante el proceso de arranque.

Resolución de problemas de servicios que fallan

Para averiguar qué servicios han fallado e inspeccionar la salida del registro:

> sudo systemctl --state=failed
Comprobación del estado de tiempo de ejecución de un servicio

Para averiguar el estado de tiempo de ejecución actual de un servicio:

> sudo systemctl status SERVICE
El apagado o el rearranque llevan mucho tiempo

Si el apagado o el rearranque tardan mucho tiempo, puede deberse a un servicio que no se está cerrando. systemd espera algún tiempo a que se cierre cada servicio antes de intentar terminarlo. Un problema común es que haya un servicio suspendido o un proceso de apagado que se haya quedado atascado. Para averiguar si es el caso, utilice lo siguiente:

> sudo systemctl poweroff
  Failed to power off system via logind: There's already a shutdown or sleep operation in progress
> sudo systemctl list-jobs

Puede cancelar los trabajos en ejecución y en espera y volver a apagar o rearrancar:

> sudo systemctl cancel
> sudo systemctl stop systemd-suspend.service

11 Prácticas recomendadas de systemd

Puede seguir algunas prácticas recomendadas para garantizar que los servicios de systemd equipados sean eficientes a la hora de manejar diferentes situaciones.

Compruebe el estado de tiempo de ejecución de un servicio

Para averiguar el estado de tiempo de ejecución actual de un servicio:

> sudo systemctl status SERVICE
Use una vía absoluta en el archivo de unidad systemd

Utilice una vía absoluta para los archivos ejecutables y los archivos necesarios, como los archivos de configuración o los guiones del archivo de unidad systemd. systemd no se basa en las variables de entorno del usuario como $PATH para localizar archivos.

Use la directiva ExecReload

Utilice la directiva ExecReload de la sección [SERVICE] cuando desee definir un comando específico que deba ejecutarse cuando cargue de nuevo un servicio con el comando systemctl reload. Esto es útil para los servicios que pueden volver a cargar dinámicamente su configuración sin reiniciar.

[Service]
ExecStart=PATH_TO_EXECUTABLE
ExecReload=PATH_TO_RELOAD_SCRIPT
Use la directiva RestartSec

Utilice la directiva RestartSec de la sección [SERVICE] cuando desee definir un retraso (en segundos) antes de que se reinicie el servicio después de un fallo. Esto es útil para los servicios que requieren un tiempo especificado para liberar recursos o evitar bucles de reinicio rápido que pueden provocar una carga alta del sistema.

[Service]
ExecStart=PATH_TO_EXECUTABLE
Restart=on-failure
RestartSec=5
Inhabilite el modo de emergencia en un equipo remoto

Puede inhabilitar el modo de emergencia en un equipo remoto, por ejemplo, un equipo virtual alojado en Google Cloud. Si este modo está habilitado, el equipo no podrá conectarse a la red. Por ejemplo:

> sudo systemctl mask emergency.service
> sudo systemctl mask emergency.target