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 :
- Identification de la liste des processus en cours d'exécution (par exemple, à l'aide de
ps). - Filtrage des processus selon différents critères (utilisateur, nom de la commande, etc.).
- Détermination de la durée de chaque processus d'intérêt.
- Comparaison de cette durée avec une valeur seuil prédéfinie.
- Envoi d'un signal de terminaison (par exemple,
SIGTERMouSIGKILL) 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.