Sobes.tech
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:

  1. Identificación de la lista de procesos en ejecución (por ejemplo, usando ps).
  2. Filtrado de procesos según diferentes criterios (usuario, nombre del comando, etc.).
  3. Determinación de la duración de cada proceso de interés.
  4. Comparación de la duración con un umbral predefinido.
  5. Envío de una señal de terminación (por ejemplo, SIGTERM o SIGKILL) 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.