Middle+
¿Qué es un long killer?
sobes.tech AI
Respuesta de la IA
Long Killer es un script personalizado en sistemas Unix/Linux diseñado para buscar y finalizar procesos que funcionan por más tiempo del establecido. Generalmente se usa para gestionar recursos y prevenir bloqueos del sistema. Puede implementarse en varios lenguajes de scripting, como Bash o Python.
Principio de funcionamiento:
- Identificación de la lista de procesos en ejecución (por ejemplo, usando
ps). - Filtrado de procesos según diferentes criterios (usuario, nombre del comando, etc.).
- Determinación de la duración de cada proceso de interés.
- Comparación de la duración con un umbral predefinido.
- Envío de una señal de terminación (por ejemplo,
SIGTERMoSIGKILL) a los procesos que superen el umbral.
Ejemplo de implementación en Bash:
#!/bin/bash
# Tiempo umbral en segundos
THRESHOLD_SECONDS=3600 # 1 hora
# Nombre del proceso a buscar. Déjelo vacío '', si desea buscar todos los procesos del usuario
PROCESS_NAME=""
# Usuario que ejecuta los procesos. Déjelo vacío '', si desea buscar procesos de todos los usuarios
USER=""
# Excluir procesos por nombre (separados por espacios)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"
# Obtenemos la lista de procesos, su tiempo de ejecución (ET), PID, nombre del comando y usuario
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
# Convertir tiempo de ejecución a segundos
SECS=0
if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Días-horas:minutos:segundos
SECS=$(( ${BASH_REMATCH[1]}*86400 + ${BASH_REMATCH[2]}*3600 + ${BASH_REMATCH[3]}*60 + ${BASH_REMATCH[4]} ))
elif [[ "$ET" =~ ([0-9]+):([0-9]+):([0-9]+) ]]; then # Horas:minutos:segundos
SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Minutos:segundos
SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
elif [[ "$ET" =~ ([0-9]+) ]]; then # Segundos
SECS=${BASH_REMATCH[1]}
fi
# Verificar condiciones para terminar
KILL=false
if [ "$SECS" -gt "$THRESHOLD_SECONDS" ]; then
KILL=true
fi
if [ -n "$PROCESS_NAME" ] && [[ ! "$CMD" =~ "$PROCESS_NAME" ]]; then
KILL=false
fi
if [ -n "$USER" ] && [ "$USER_NAME" != "$USER" ]; then
KILL=false
fi
# Verificar lista de exclusión
for EXCLUDE in $EXCLUDE_PROCESSES; do
if [[ "$CMD" == *"$EXCLUDE"* ]]; then
KILL=false
break
fi
done
# Finalizar proceso si se cumplen todas las condiciones y no es este script
if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
echo "Terminando proceso $PID ($CMD) que lleva $ET"
kill $PID # Se puede usar kill -9 $PID para forzar la terminación
fi
done
Este script puede programarse para ejecutarse periódicamente, por ejemplo, mediante Crontab.
# Ejecutar cada minuto
* * * * * /ruta/a/tu/long_killer.sh >> /var/log/long_killer.log 2>&1
Es importante ajustar cuidadosamente los criterios y umbrales para evitar terminar procesos importantes del sistema de manera no intencionada.