Ir al contenido principal

Supervisión de archivos de unidad systemd en Linux

Por qué los archivos de unidad systemd de Linux desencadenan falsas alertas.

Actualizado hoy

Introduction

Algunos servicios de Linux están diseñados para salir después de la inicialización — y eso dispara monitores de servicio. Si está observando uno con un monitor de servicio en Level, obtendrá alertas falsas. La solución es un monitor de script que leeSubState instead of ActiveState.


Por qué los monitores de servicio disparan alertas falsas

systemd rastrea cada unidad en dos campos de estado:ActiveState and SubState. Los monitores de servicio verificanActiveState — values like active, inactive, or failed.

The problem:ciertos servicios se cierran después de hacer su trabajo y nunca entran en un estado persistenteactiveElwg-quickes el ejemplo más común. Configura la interfaz VPN y luego se cierra. systemd registraActiveState as inactive (exited). Un monitor de servicio veinactivey dispara una alerta — aunque la VPN funciona correctamente, la interfaz está activa y el tráfico se enruta.

Wiregard Example

SubStatecuenta una historia más precisa. Para servicios comowg-quick, un SubState saludable esexited— esperado y normal. Un SubState defailedsignificaría que algo realmente salió mal. VerificaciónSubStatedirectamente es lo que le permite notar la diferencia.


Verificar SubState con un script

Use systemctl showpara leer el SubState de cualquier unidad:

systemctl show -p SubState --value <unit_name>

Esto devuelve una sola cadena —running, exited, dead, failed, etc. — que puede evaluar en un monitor de script.

🖥️ PLATFORM NOTE:

  • Linux:Compatible con cualquier distribución que use systemd.

  • Windows / macOS: Not applicable. systemctl is Linux-only.


Ejemplo: Supervisión de una interfaz WireGuard

El siguiente script verifica siwg-quick@wg0está en elexitedSubState esperado. Cambie el nombre de la unidad real si es diferente.

#!/bin/bash

UNIT_NAME="wg-quick@wg0"
STATUS=$(systemctl show -p SubState --value $UNIT_NAME)

if [ "$STATUS" = "exited" ]; then
echo "Service is running correctly."
exit 0
else
echo "ALERT: Service is not running. SubState: $STATUS"
exit 1
fi

El script genera una cadena de estado legible y sale con el código 0 (saludable) o 1 (estado inesperado). Configure el monitor de script para que se dispare cuando la salidaContainsla cadena de error "ALERT".

Configuración del monitor:

Field

Value

Tipo

Run script

OS

Linux

Script

Linux - Verificación de SubState de WireGuard

Script output

Contains

Value

ALERT

Run frequency

5 minutes

Trigger count

2

💡 TIP: Set Trigger counta 2 o superior para evitar alertas de estados transitorios durante reinicios o reinicios de servicio.


Otros tipos de unidad que se cierran por diseño

wg-quickes el caso más común, pero cualquiera de estos puede desencadenar el mismo patrón de falsa alerta:

  • Servicios únicos— ejecutan una tarea y se cierran;SubState will be exited when healthy

  • Timer units— se ejecuta según un horario; verificarActiveStatepara la unidad de temporizador en sí, no el servicio que lanza

  • Servicios Type=forking— el proceso padre se cierra después de generar un hijo; SubState puede serexitedmientras se ejecuta el hijo

Para todos estos, un monitor de script que verificaSubStatecontra su valor conocido-bueno es el enfoque correcto.


FAQ

  • Mi servicio WireGuard se muestra como Down en Level pero el tráfico se enruta bien. ¿Qué está pasando? wg-quickse cierra después de configurar la interfaz VPN — eso es normal. La interfaz de red permanece activa aunque el proceso de servicio se cerró. Un monitor de servicio veinactivey dispara una alerta. Use un monitor de script que verifiqueSubState (which returns exited, el valor saludable) en su lugar.

  • ¿Cómo sé qué valor de SubState esperar cuando un servicio es saludable? Run systemctl show -p SubState --value <unit_name>en un dispositivo donde el servicio funciona correctamente. Lo que sea que devuelva es su línea de base saludable. Script contra ese valor.

  • ¿Puedo verificar ActiveState y SubState en el mismo monitor?Sí. Escriba el script para leer ambos y fallar si alguno es inesperado. Esto le da una cobertura más amplia — puede detectar servicios que salieron inesperadamente (SubState: failed) separado de servicios que simplemente se detuvieron (ActiveState: inactive).

  • ¿Funciona esto en distribuciones de Linux que no usan systemd? No. systemctlrequiere systemd. En distribuciones que usan SysVinit o Upstart, necesitaría herramientas diferentes (por ejemplo,service <name> status). La mayoría de las distribuciones de Linux mantenidas activamente se envían con systemd.

¿Ha quedado contestada tu pregunta?