Linux: systemctl daemon-reload

LinuxBeginner
Practicar Ahora

Introducción

Este tutorial lo guiará a través del proceso de uso del comando systemctl daemon-reload para administrar los demonios y servicios del sistema en su sistema Linux. Systemd es el administrador de servicios predeterminado para la mayoría de las distribuciones Linux modernas, y entender cómo actualizar adecuadamente las configuraciones de los servicios es una habilidad esencial para los usuarios y administradores de Linux.

En este laboratorio (lab), aprenderá cuándo y por qué usar el comando systemctl daemon-reload, creará y modificará archivos de servicios y aplicará cambios de configuración sin interrumpir las operaciones de su sistema. Al final de este tutorial, se sentirá cómodo trabajando con servicios de systemd y aplicando cambios de configuración de manera efectiva.

Este Lab requiere una conexión a Internet para el aprendizaje, por lo que solo los usuarios Pro pueden iniciar la máquina virtual (VM). Actualice su cuenta a Pro.

Comprendiendo los conceptos básicos de systemd y systemctl

Systemd es el administrador de servicios y sistema para la mayoría de las distribuciones Linux modernas, incluyendo Ubuntu 22.04 que estamos usando en este laboratorio. Es responsable de iniciar y administrar los servicios del sistema, y systemctl es la herramienta principal de línea de comandos utilizada para interactuar con systemd.

¿Qué es un demonio del sistema?

Un demonio es un proceso de fondo que se ejecuta continuamente en tu sistema Linux. Estos procesos realizan varias tareas como servir páginas web (Apache, Nginx), administrar bases de datos (MySQL, PostgreSQL) o manejar eventos del sistema. Systemd gestiona estos demonios a través de archivos de configuración estandarizados llamados "archivos de unidad".

Comandos básicos de systemctl

Comencemos explorando algunos comandos básicos de systemctl para entender el estado actual de tu sistema:

  1. Abra una terminal haciendo clic en el icono de Terminal.

  2. Liste todos los servicios activos del sistema con el siguiente comando:

systemctl list-units --type=service
systemctl list-units --type=service

Este comando muestra todos los servicios actualmente activos en tu sistema. Deberías ver una salida similar a:

UNIT                                      LOAD   ACTIVE SUB     DESCRIPTION
accounts-daemon.service                   loaded active running Accounts Service
apparmor.service                          loaded active exited  AppArmor initialization
avahi-daemon.service                      loaded active running Avahi mDNS/DNS-SD Stack
...

Presione Ctrl+C o Q para salir del comando.

  1. Verifique el estado de un servicio específico, por ejemplo, el servicio SSH:
systemctl status ssh
systemctl status ssh

Deberías ver información detallada sobre el servicio SSH, incluyendo si está activo, su identificador de proceso y las entradas de registro recientes:

● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2023-06-13 12:34:56 UTC; 3h 25min ago
       Docs: man:sshd(8)
             man:sshd_config(5)
    Process: 1234 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
   Main PID: 1235 (sshd)
      Tasks: 1 (limit: 4915)
     Memory: 5.6M
        CPU: 236ms
     CGroup: /system.slice/ssh.service
             └─1235 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
  1. Veamos dónde se almacenan los archivos de servicio de systemd. Estos son los archivos con los que trabajaremos en los siguientes pasos:
ls -l /etc/systemd/system/

Este directorio contiene archivos de unidad de servicio que definen cómo systemd gestiona los servicios. Deberías ver varios archivos .service y enlaces simbólicos.

  1. Los archivos de unidad proporcionados por el sistema se encuentran en un directorio diferente. Veamoslos:
ls -l /lib/systemd/system/

Este directorio contiene los archivos de unidad de servicio predeterminados que vienen con tu sistema.

Ahora que comprendes los conceptos básicos de systemd y cómo verificar el estado de los servicios, estás listo para crear y modificar archivos de servicio en el siguiente paso.

Creando un archivo de servicio simple de systemd

En este paso, crearás un archivo de servicio simple de systemd que ejecutará un script personalizado. Esto te ayudará a entender cómo funcionan los archivos de servicio y cómo modificarlos.

Crear un script simple

Primero, creemos un script simple que ejecutará nuestro servicio:

  1. Crea un directorio para tu script:
mkdir -p ~/project/scripts
  1. Utiliza el editor de texto nano para crear un script simple:
nano ~/project/scripts/hello-service.sh
  1. Agrega el siguiente contenido al script:
#!/bin/bash

while true; do
  echo "Hello from custom service: $(date)" >> /tmp/hello-service.log
  sleep 10
done

Presiona Ctrl+X para salir del editor, luego Y para guardar el archivo y luego Enter para confirmar el nombre del archivo.

Este script simplemente escribe un mensaje con la fecha actual en un archivo de registro cada 10 segundos.

  1. Haz el script ejecutable:
chmod +x ~/project/scripts/hello-service.sh

Crear un archivo de unidad de servicio de systemd

Ahora, creemos un archivo de servicio de systemd que ejecutará este script:

  1. Crea un nuevo archivo de servicio con privilegios de sudo:
sudo nano /etc/systemd/system/hello-service.service
  1. Agrega el siguiente contenido al archivo de servicio:
[Unit]
Description=Hello Service Demo
After=network.target

[Service]
Type=simple
ExecStart=/home/labex/project/scripts/hello-service.sh
Restart=on-failure
User=labex

[Install]
WantedBy=multi-user.target

Veamos cada sección de este archivo:

  • [Unit]: Contiene metadatos y dependencias

    • Description: Una descripción legible por humanos del servicio
    • After: Especifica que este servicio debe iniciar después de que la red esté lista
  • [Service]: Define cómo se debe ejecutar el servicio

    • Type=simple: El servicio se inicia inmediatamente
    • ExecStart: El comando a ejecutar (nuestro script)
    • Restart: Reinicia automáticamente el servicio si falla
    • User: La cuenta de usuario con la que se ejecutará el servicio
  • [Install]: Define cuándo y cómo se debe habilitar el servicio

    • WantedBy: Especifica cuándo se debe iniciar el servicio (multi-user.target significa operación normal del sistema)
  1. Guarda el archivo y sale del editor (presiona Ctrl+X, luego Y y luego Enter en nano).

  2. Veamos nuestro recién creado archivo de servicio:

cat /etc/systemd/system/hello-service.service

Deberías ver el contenido que acabas de agregar al archivo.

cat /etc/systemd/system/hello-service.service

En el siguiente paso, aprenderás cómo cargar y iniciar este servicio utilizando el comando systemctl daemon-reload.

Usando systemctl daemon-reload para Aplicar Cambios

Ahora que has creado un archivo de servicio de systemd, necesitas informar a systemd sobre este nuevo servicio. Aquí es donde entra en juego el comando systemctl daemon-reload.

¿Qué es systemctl daemon-reload?

El comando systemctl daemon-reload instruye a systemd que recargue todos los archivos de servicio y actualice su configuración interna. Esto es necesario siempre que:

  • Crees un nuevo archivo de servicio
  • Modifiques un archivo de servicio existente
  • Eliminas un archivo de servicio

Sin ejecutar este comando, systemd no reconocerá tus cambios.

Recargar la configuración de systemd

  1. Ejecuta el siguiente comando para recargar la configuración de systemd:
sudo systemctl daemon-reload

Este comando no produce ninguna salida cuando es exitoso, pero actualiza la configuración interna de systemd.

  1. Ahora veamos si systemd reconoce nuestro nuevo servicio:
systemctl status hello-service

Deberías ver una salida que muestre que el servicio está cargado pero inactivo:

● hello-service.service - Hello Service Demo
     Loaded: loaded (/etc/systemd/system/hello-service.service; disabled; vendor preset: enabled)
     Active: inactive (dead)

Iniciar el servicio

  1. Iniciemos nuestro servicio:
sudo systemctl start hello-service
  1. Verifiquemos el estado nuevamente para ver si está en ejecución:
systemctl status hello-service
systemctl status hello-service

Ahora deberías ver que el servicio está activo y en ejecución:

● hello-service.service - Hello Service Demo
     Loaded: loaded (/etc/systemd/system/hello-service.service; disabled; vendor preset: enabled)
     Active: active (running) since [timestamp]; [time] ago
   Main PID: [pid number] (hello-service.sh)
      Tasks: 2 (limit: 4915)
     Memory: 592.0K
        CPU: 5ms
     CGroup: /system.slice/hello-service.service
             └─[pid number] /bin/bash /home/labex/project/scripts/hello-service.sh
  1. Verifiquemos que nuestro servicio esté realmente funcionando revisando el archivo de registro que crea:
cat /tmp/hello-service.log

Deberías ver varias líneas de salida similares a:

Hello from custom service: Wed Jun 14 15:30:45 UTC 2023
Hello from custom service: Wed Jun 14 15:30:55 UTC 2023
Hello from custom service: Wed Jun 14 15:31:05 UTC 2023

Las entradas del registro mostrarán la fecha y hora actual, lo que confirma que nuestro servicio está en ejecución y ejecutando el script como se esperaba.

  1. Habilite el servicio para que se inicie automáticamente al encender el sistema:
sudo systemctl enable hello-service

Deberías ver una salida similar a:

Created symlink /etc/systemd/system/multi-user.target.wants/hello-service.service → /etc/systemd/system/hello-service.service.

Esto significa que el servicio ahora está habilitado y se iniciará automáticamente cuando el sistema se encienda.

Ahora has creado con éxito un servicio, has usado systemctl daemon-reload para informar a systemd sobre él y has iniciado el servicio. En el siguiente paso, modificarás el servicio y aplicarás los cambios.

Modificando la Configuración del Servicio

En este paso, modificarás la configuración de tu servicio y aplicarás los cambios utilizando systemctl daemon-reload. Esto demostrará la importancia de este comando al actualizar las configuraciones de servicio.

Modificar el archivo de servicio

Modifiquemos nuestro servicio para cambiar la frecuencia con la que registra mensajes:

  1. Edita el archivo de servicio:
sudo nano /etc/systemd/system/hello-service.service
  1. Agrega una nueva variable de entorno a la sección [Service] para controlar el intervalo de espera. Agrega esta línea después de la línea User=labex:
Environment="SLEEP_INTERVAL=5"
  1. Guarda y sale del archivo (presiona Ctrl+X, luego Y, luego Enter en nano).

  2. Ahora, edita el script para utilizar esta variable de entorno:

nano ~/project/scripts/hello-service.sh
  1. Modifica el script para utilizar la variable de entorno (reemplaza todo el contenido con esto):
#!/bin/bash

## Default to 10 seconds if environment variable is not set
INTERVAL=${SLEEP_INTERVAL:-10}

while true; do
  echo "Hello from custom service: $(date) - Interval: ${INTERVAL}s" >> /tmp/hello-service.log
  sleep $INTERVAL
done
  1. Guarda y sale del editor (presiona Ctrl+X, luego Y, luego Enter en nano).

Aplicar los cambios

Ahora que has realizado cambios tanto en el archivo de servicio como en el script, debes aplicar estos cambios:

  1. Primero, recarga la configuración de systemd:
sudo systemctl daemon-reload
  1. Luego, reinicia el servicio para aplicar los cambios:
sudo systemctl restart hello-service
  1. Verifica el estado del servicio:
systemctl status hello-service

Deberías ver que el servicio está en ejecución con la configuración actualizada.

  1. Verifica que los cambios hayan tenido efecto revisando el archivo de registro:
sleep 15 ## Espera a recopilar algunos registros
cat /tmp/hello-service.log | tail -5

Ahora deberías ver que el servicio está registrando mensajes cada 5 segundos en lugar de 10, y las entradas del registro deberían incluir la nueva información de intervalo:

Hello from custom service: Wed Jun 14 15:45:10 UTC 2023 - Interval: 5s
Hello from custom service: Wed Jun 14 15:45:15 UTC 2023 - Interval: 5s
Hello from custom service: Wed Jun 14 15:45:20 UTC 2023 - Interval: 5s
cat /tmp/hello-service.log | tail -5

Comprendiendo lo que sucedió

Veamos lo que acaba de suceder:

  1. Modificaste el archivo de servicio para agregar una variable de entorno.
  2. Actualizaste el script para utilizar esta variable de entorno.
  3. Ejecutaste systemctl daemon-reload para informar a systemd sobre los cambios en el archivo de servicio.
  4. Reiniciaste el servicio para aplicar estos cambios.

Sin el comando systemctl daemon-reload, systemd no habría reconocido los cambios en el archivo de servicio, y la variable de entorno no habría sido pasada al script al reiniciar el servicio.

Esto demuestra por qué systemctl daemon-reload es esencial siempre que modificas archivos de servicio: asegura que systemd sea consciente de tus cambios antes de intentar aplicarlos al iniciar o reiniciar servicios.

Solución de Problemas y Mejores Prácticas

En este último paso, aprenderás sobre los problemas comunes que pueden surgir al trabajar con servicios de systemd y cómo solucionarlos. También aprenderás algunas mejores prácticas para trabajar con systemctl daemon-reload.

Solución de problemas comunes

1. El servicio no se inicia

Si tu servicio no se inicia, el primer paso es comprobar su estado:

systemctl status hello-service

Esto a menudo proporciona información detallada de error. Vamos a crear intencionalmente un error para ver cómo solucionarlo:

  1. Edita el archivo de servicio:
sudo nano /etc/systemd/system/hello-service.service
  1. Cambia la línea ExecStart para que apunte a un script que no existe:
ExecStart=/home/labex/project/scripts/non-existent.sh
  1. Guarda y sale del editor.

  2. Recarga la configuración de systemd y trata de reiniciar el servicio:

sudo systemctl daemon-reload
sudo systemctl restart hello-service
  1. Comprueba el estado para ver el error:
systemctl status hello-service

Deberías ver mensajes de error que indican que el script no existe:

● hello-service.service - Hello Service Demo
     Loaded: loaded (/etc/systemd/system/hello-service.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since [timestamp]; [time] ago
    Process: [pid] ExecStart=/home/labex/project/scripts/non-existent.sh (code=exited, status=203/EXEC)
   Main PID: [pid] (code=exited, status=203/EXEC)
        CPU: 5ms

[timestamp] systemd[1]: Started Hello Service Demo.
[timestamp] systemd[pid]: hello-service.service: Failed to execute command: No such file or directory
[timestamp] systemd[pid]: hello-service.service: Failed at step EXEC spawning /home/labex/project/scripts/non-existent.sh: No such file or directory
[timestamp] systemd[1]: hello-service.service: Main process exited, code=exited, status=203/EXEC
[timestamp] systemd[1]: hello-service.service: Failed with result 'exit-code'.
  1. Corrige el archivo de servicio para que apunte de nuevo al script correcto:
sudo nano /etc/systemd/system/hello-service.service
  1. Cambia la línea ExecStart de nuevo a:
ExecStart=/home/labex/project/scripts/hello-service.sh
  1. Guarda y sale, luego recarga y reinicia:
sudo systemctl daemon-reload
sudo systemctl restart hello-service
  1. Verifica que el servicio esté en ejecución de nuevo:
systemctl status hello-service

2. Leer los registros del diario para obtener más información

Al solucionar problemas, puedes usar journalctl para ver los registros detallados:

sudo journalctl -u hello-service

Esto muestra todos los registros de la unidad hello-service, lo que puede ser invaluable para diagnosticar problemas.

Para ver solo los registros más recientes:

sudo journalctl -u hello-service -n 20

Para seguir los registros en tiempo real (similar a tail -f):

sudo journalctl -u hello-service -f

Presiona Ctrl+C para salir del modo de seguimiento de registros.

Mejores prácticas para trabajar con systemctl daemon-reload

Aquí hay algunas mejores prácticas para seguir cuando trabajas con systemd y el comando daemon-reload:

  1. Siempre recarga después de los cambios: Siempre ejecuta systemctl daemon-reload después de modificar, agregar o eliminar cualquier archivo de unidad de systemd.

  2. Comprueba la sintaxis antes de aplicar: Puedes usar el siguiente comando para comprobar si hay errores de sintaxis en tus archivos de servicio antes de recargar:

sudo systemd-analyze verify /etc/systemd/system/hello-service.service

Si no hay errores, este comando no produce ninguna salida. Cualquier error de sintaxis se reportará.

  1. Utiliza plantillas de servicio: Para servicios que requieren múltiples instancias, utiliza plantillas de servicio (archivos con nombres como service@.service) para evitar la duplicación.

  2. Revisa las dependencias del servicio: Asegúrate de que tus servicios tengan las directivas After= y Requires= correctas para garantizar que se inicien en el orden correcto.

  3. Limpia adecuadamente: Cuando eliminas un servicio, asegúrate de detenerlo y deshabilitarlo antes de eliminar el archivo de servicio:

sudo systemctl stop hello-service
sudo systemctl disable hello-service
sudo rm /etc/systemd/system/hello-service.service
sudo systemctl daemon-reload

Limpiemos ahora nuestro servicio de ejemplo:

sudo systemctl stop hello-service
sudo systemctl disable hello-service

Deberías ver una salida que indique que el enlace simbólico fue eliminado:

Removed /etc/systemd/system/multi-user.target.wants/hello-service.service.

No eliminaremos el archivo de servicio todavía, ya que todavía lo necesitamos para la verificación.

Ahora entiendes cómo crear, modificar y solucionar problemas de servicios de systemd, así como la importancia del comando systemctl daemon-reload en la gestión de estos servicios.

Resumen

En este laboratorio, has aprendido cómo usar el comando systemctl daemon-reload para administrar demonios y servicios del sistema en tu sistema Linux. Has:

  • Comprendido los conceptos básicos de systemd y systemctl
  • Creado un archivo de servicio personalizado de systemd
  • Utilizado systemctl daemon-reload para aplicar cambios a las configuraciones de servicio
  • Modificado archivos de servicio y aplicado esos cambios
  • Aprendido cómo solucionar problemas comunes y seguir las mejores prácticas

El comando systemctl daemon-reload es esencial cuando se trabaja con servicios de systemd, ya que garantiza que el administrador de systemd sea consciente de cualquier cambio que realices en las configuraciones de servicio. Sin este comando, los cambios que realices en los archivos de servicio no serán reconocidos por el sistema hasta el siguiente reinicio.

Este conocimiento será valioso a medida que sigas trabajando con sistemas Linux, ya que te permitirá administrar eficazmente los servicios y garantizar que los cambios de configuración se apliquen correctamente.