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:
Abra una terminal haciendo clic en el icono de Terminal.
Liste todos los servicios activos del sistema con el siguiente comando:
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.
- Verifique el estado de un servicio específico, por ejemplo, el servicio 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"
- 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.
- 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:
- Crea un directorio para tu script:
mkdir -p ~/project/scripts
- Utiliza el editor de texto
nanopara crear un script simple:
nano ~/project/scripts/hello-service.sh
- 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.
- 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:
- Crea un nuevo archivo de servicio con privilegios de
sudo:
sudo nano /etc/systemd/system/hello-service.service
- 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 servicioAfter: 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 inmediatamenteExecStart: El comando a ejecutar (nuestro script)Restart: Reinicia automáticamente el servicio si fallaUser: 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)
Guarda el archivo y sale del editor (presiona
Ctrl+X, luegoYy luegoEnteren nano).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.

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
- 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.
- 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
- Iniciemos nuestro servicio:
sudo systemctl start hello-service
- Verifiquemos el estado nuevamente para ver si está en ejecución:
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
- 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.
- 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:
- Edita el archivo de servicio:
sudo nano /etc/systemd/system/hello-service.service
- 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íneaUser=labex:
Environment="SLEEP_INTERVAL=5"
Guarda y sale del archivo (presiona
Ctrl+X, luegoY, luegoEnteren nano).Ahora, edita el script para utilizar esta variable de entorno:
nano ~/project/scripts/hello-service.sh
- 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
- Guarda y sale del editor (presiona
Ctrl+X, luegoY, luegoEnteren nano).
Aplicar los cambios
Ahora que has realizado cambios tanto en el archivo de servicio como en el script, debes aplicar estos cambios:
- Primero, recarga la configuración de systemd:
sudo systemctl daemon-reload
- Luego, reinicia el servicio para aplicar los cambios:
sudo systemctl restart hello-service
- Verifica el estado del servicio:
systemctl status hello-service
Deberías ver que el servicio está en ejecución con la configuración actualizada.
- 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

Comprendiendo lo que sucedió
Veamos lo que acaba de suceder:
- Modificaste el archivo de servicio para agregar una variable de entorno.
- Actualizaste el script para utilizar esta variable de entorno.
- Ejecutaste
systemctl daemon-reloadpara informar a systemd sobre los cambios en el archivo de servicio. - 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:
- Edita el archivo de servicio:
sudo nano /etc/systemd/system/hello-service.service
- Cambia la línea
ExecStartpara que apunte a un script que no existe:
ExecStart=/home/labex/project/scripts/non-existent.sh
Guarda y sale del editor.
Recarga la configuración de systemd y trata de reiniciar el servicio:
sudo systemctl daemon-reload
sudo systemctl restart hello-service
- 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'.
- Corrige el archivo de servicio para que apunte de nuevo al script correcto:
sudo nano /etc/systemd/system/hello-service.service
- Cambia la línea
ExecStartde nuevo a:
ExecStart=/home/labex/project/scripts/hello-service.sh
- Guarda y sale, luego recarga y reinicia:
sudo systemctl daemon-reload
sudo systemctl restart hello-service
- 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:
Siempre recarga después de los cambios: Siempre ejecuta
systemctl daemon-reloaddespués de modificar, agregar o eliminar cualquier archivo de unidad de systemd.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á.
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.Revisa las dependencias del servicio: Asegúrate de que tus servicios tengan las directivas
After=yRequires=correctas para garantizar que se inicien en el orden correcto.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.



