Gestión del ciclo de vida y monitorización de servicios
systemctl
En este manual, veremos cómo gestionar los servicios en sistemas basados en Linux utilizando systemctl
, una herramienta que forma parte de systemd. Esta herramienta es fundamental para administrar servicios, controlar el estado de los mismos, y gestionar su ciclo de vida.
¿Qué es systemd y systemctl?
systemd es un sistema de inicialización y un gestor de servicios que gestiona los procesos y recursos del sistema. systemctl
es la utilidad principal que se utiliza para interactuar con systemd.
Comandos Básicos de systemctl
Estos son algunos de los comandos más usados para administrar los servicios:
-
Iniciar un Servicio
Para iniciar un servicio de manera manual, utiliza el siguiente comando:
sudo systemctl start <nombre_servicio>
-
Detener un Servicio Si quieres detener un servicio que está corriendo, utiliza:
sudo systemctl stop <nombre_servicio>
-
Reiniciar un Servicio Reiniciar un servicio es útil cuando quieres que se apliquen cambios de configuración.
sudo systemctl restart <nombre_servicio>
-
Recargar la Configuración de un Servicio Para recargar la configuración de un servicio sin interrumpir su funcionamiento:
sudo systemctl reload <nombre_servicio>
-
Habilitar un Servicio Para que un servicio se inicie automáticamente al arrancar el sistema, puedes habilitarlo con:
sudo systemctl enable <nombre_servicio>
-
Deshabilitar un Servicio Si no quieres que el servicio se inicie automáticamente en el arranque:
sudo systemctl disable <nombre_servicio>
-
Comprobar el Estado de un Servicio Para verificar si un servicio está activo, detenido, o fallando, utiliza:
sudo systemctl status <nombre_servicio>
Ciclo de Vida de un Servicio
El ciclo de vida de un servicio bajo systemd se puede dividir en varios estados clave:
- Inactivo (Dead): El servicio está completamente detenido.
- Activo (Active): El servicio está funcionando correctamente.
- Activado (Enabled): El servicio está configurado para iniciarse automáticamente al arrancar el sistema.
- Deshabilitado (Disabled): El servicio no se iniciará automáticamente.
- Fallando (Failed): El servicio intentó iniciarse pero no lo consiguió. Puedes usar systemctl status para obtener más detalles.
journalctl
Ahora explicaremos cómo utilizar journalctl
, la herramienta de systemd para visualizar y gestionar los logs del sistema. Veremos cómo se relaciona con syslog, la ubicación de los archivos de logs y cómo algunos servicios pueden tener sus propios registros.
¿Qué es journalctl?
journalctl
es una utilidad incluida en systemd que permite consultar los logs centralizados del sistema. A diferencia de los sistemas tradicionales de logs, que utilizan archivos de texto como /var/log/syslog
, journalctl
almacena los logs en un formato binario, lo que permite búsquedas más rápidas y avanzadas opciones de filtrado.
Relación con syslog y /var/log/syslog
Antes de systemd, la mayoría de los sistemas usaban syslog
o variantes como rsyslog
para la gestión de logs. Los mensajes del sistema se escribían en archivos de texto plano ubicados en /var/log
, siendo /var/log/syslog
uno de los más importantes.
/var/log/syslog
: Este archivo sigue existiendo en muchos sistemas actuales, especialmente si se ejecuta un servicio de syslog comorsyslog
junto a systemd. En este caso,rsyslog
captura mensajes del sistema, incluyendo mensajes que también están registrados porjournalctl
.journalctl vs syslog
:journalctl
centraliza la gestión de los logs de todos los servicios controlados por systemd. Sin embargo, en algunos casos, los servicios específicos pueden continuar escribiendo en sus propios archivos de logs en /var/log, y algunos administradores optan por mantener ambos sistemas en paralelo.
Logs Específicos de Servicios
Algunos servicios tienen archivos de logs propios que no están gestionados por systemd. Por ejemplo, el servidor web Apache escribe sus logs en /var/log/apache2/
(o similar), mientras que systemd solo gestiona los logs relacionados con el estado del servicio. Esto significa que si bien journalctl
proporciona una visión global de todos los eventos del sistema, no siempre captura los detalles específicos de aplicaciones que mantienen sus propios archivos de logs.
Opciones Más Usadas de journalctl
Aquí están las opciones más comunes que puedes utilizar para gestionar y visualizar los logs con journalctl
:
-
Ver todos los logs del sistema Muestra todos los logs del sistema de manera cronológica:
sudo journalctl
-
Filtrar por servicio Para ver los logs de un servicio específico, por ejemplo, nginx:
sudo journalctl -u nginx
- Mostrar solo los logs recientes
Puedes limitar la salida a los logs recientes con la opción -b, que muestra solo los mensajes desde el último arranque:
sudo journalctl -b
-
Ver logs en tiempo real Al igual que
tail -f
, puedes seguir los logs en tiempo real:sudo journalctl -f
- Filtrar por fecha y hora
Puedes buscar logs dentro de un rango de tiempo específico. Por ejemplo, para ver los logs desde una fecha específica:
sudo journalctl --since "2024-10-07 10:00:00"
También puedes especificar un rango hasta una fecha y hora concreta:
sudo journalctl --since "2024-10-07 10:00:00" --until "2024-10-07 12:00:00"
-
Filtrar por prioridad journalctl permite filtrar los logs por su nivel de prioridad. Las prioridades están numeradas del 0 (emergencia) al 7 (depuración). Para mostrar solo los mensajes de error, puedes usar. Sepuede poner un rango de prioridades con
-p err1..err2
:sudo journalctl -p err
- Mostrar mensajes del kernel
Para ver solo los mensajes del kernel (
dmesg
):sudo journalctl -k
-
Borrar los logs de journalctl En ocasiones, es necesario liberar espacio eliminando logs antiguos. Para saber cuanto espacio ocupan tus logs:
sudo journalctl --disk-usage
Puedes eliminar todos los logs o especificar un tamaño máximo permitido:
sudo journalctl --vacuum-size=500M
Esto eliminará los logs más antiguos hasta que los archivos ocupen menos de 500 MB. También podemos decir que queremos borrar todos los logs más antiguos de una fecha. En este caso, se aceptan unidades como «s» para segundo, «m» para minutos, «h» para horas, «w» para semanas o «M» para meses.
sudo journalctl --vacuum-time=1M
Esto borraría los logs más antiguos de un mes.
Ejemplo Práctico
Imagina que estás administrando un servidor y necesitas investigar por qué un servicio de nginx falló recientemente. Aquí hay un flujo típico usando journalctl
:
-
Ver los logs recientes del servicio nginx:
sudo journalctl -u nginx --since "1 hour ago"
-
Seguir los logs en tiempo real para ver si el servicio se recupera:
sudo journalctl -u nginx -f
-
Consultar solo los mensajes de error:
sudo journalctl -u nginx -p 0..4
-
Investigar los mensajes del kernel si sospechas de un problema de hardware:
sudo journalctl -k --since "1 hour ago"