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
ExecStart para 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
ExecStart de 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
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-reload despué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= y Requires= 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.