Sobes.tech
Middle+

Qu'est-ce qu'un long killer?

sobes.tech IA

Réponse de l'IA

Long Killer est un script personnalisé pour les systèmes Unix/Linux, conçu pour rechercher et forcer la terminaison des processus qui fonctionnent plus longtemps que la durée spécifiée. Il est généralement utilisé pour gérer les ressources et éviter le gel du système. Il peut être implémenté dans divers langages de script, tels que Bash ou Python.

Principe de fonctionnement :

  1. Identification de la liste des processus en cours d'exécution (par exemple, à l'aide de ps).
  2. Filtrage des processus selon différents critères (utilisateur, nom de la commande, etc.).
  3. Détermination de la durée de chaque processus d'intérêt.
  4. Comparaison de cette durée avec une valeur seuil prédéfinie.
  5. Envoi d'un signal de terminaison (par exemple, SIGTERM ou SIGKILL) aux processus dépassant ce seuil.

Exemple d'implémentation en Bash :

#!/bin/bash

# Durée seuil en secondes
THRESHOLD_SECONDS=3600 # 1 heure

# Nom du processus à rechercher. Laissez vide '', si vous souhaitez rechercher tous les processus de l'utilisateur
PROCESS_NAME=""

# Utilisateur qui exécute les processus. Laissez vide '', si vous souhaitez rechercher tous les processus
USER=""

# Exclure certains processus par nom (séparés par des espaces)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"

# Obtenir la liste des processus, leur temps d'exécution (ET), PID, nom de la commande et utilisateur
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
    # Convertir le temps d'exécution en secondes
    SECS=0
    if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Jours-heures:minutes:secondes
        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 # Heures:minutes:secondes
        SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
    elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Minutes:secondes
        SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
    elif [[ "$ET" =~ ([0-9]+) ]]; then # Secondes
        SECS=${BASH_REMATCH[1]}
    fi

    # Vérifier les conditions pour tuer
    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

    # Vérifier la liste d'exclusion
    for EXCLUDE in $EXCLUDE_PROCESSES; do
        if [[ "$CMD" == *"$EXCLUDE"* ]]; then
            KILL=false
            break
        fi
    done

    # Terminer le processus si toutes les conditions sont remplies et que ce n'est pas ce script
    if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
        echo "Tuer le processus $PID ($CMD) qui tourne depuis $ET"
        kill $PID # Peut utiliser kill -9 $PID pour forcer la terminaison
    fi
done

Ce script peut être lancé périodiquement, par exemple via Crontab.

# Exécuter chaque minute
* * * * * /chemin/vers/votre/long_killer.sh >> /var/log/long_killer.log 2>&1

Il est crucial d'ajuster soigneusement les critères et seuils pour éviter de terminer involontairement des processus importants du système.