Middle+
Cos'è un long killer?
sobes.tech AI
Risposta dell'AI
Long Killer è uno script personalizzato in sistemi Unix/Linux, progettato per cercare e terminare forzatamente i processi che funzionano più a lungo del tempo stabilito. Viene generalmente usato per gestire le risorse e prevenire blocchi del sistema. Può essere implementato in vari linguaggi di scripting come Bash o Python.
Principio di funzionamento:
- Identificazione della lista dei processi in esecuzione (ad esempio, usando
ps). - Filtraggio dei processi secondo diversi criteri (utente, nome del comando, ecc.).
- Determinazione della durata di ogni processo di interesse.
- Confronto della durata con un valore soglia predefinito.
- Invio di un segnale di terminazione (ad esempio,
SIGTERMoSIGKILL) ai processi che superano la soglia.
Esempio di implementazione in Bash:
#!/bin/bash
# Tempo soglia in secondi
THRESHOLD_SECONDS=3600 # 1 ora
# Nome del processo da cercare. Lasciare vuoto '', se si vogliono cercare tutti i processi dell'utente
PROCESS_NAME=""
# Utente che esegue i processi. Lasciare vuoto '', se si vogliono cercare processi di tutti gli utenti
USER=""
# Escludere processi per nome (separati da spazi)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"
# Ottieni la lista dei processi, il tempo di esecuzione (ET), PID, nome del comando e utente
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
# Convertire il tempo di esecuzione in secondi
SECS=0
if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Giorni-ore:minuti:secondi
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 # Ore:minuti:secondi
SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Minuti:secondi
SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
elif [[ "$ET" =~ ([0-9]+) ]]; then # Secondi
SECS=${BASH_REMATCH[1]}
fi
# Verificare le condizioni per terminare
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
# Verificare la lista di esclusione
for EXCLUDE in $EXCLUDE_PROCESSES; do
if [[ "$CMD" == *"$EXCLUDE"* ]]; then
KILL=false
break
fi
done
# Terminare il processo se tutte le condizioni sono soddisfatte e non è questo script
if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
echo "Terminazione del processo $PID ($CMD) in corso da $ET"
kill $PID # È possibile usare kill -9 $PID per terminare forzatamente
fi
done
Questo script può essere pianificato per essere eseguito periodicamente, ad esempio tramite Crontab.
# Eseguire ogni minuto
* * * * * /percorso/del/tuo/long_killer.sh >> /var/log/long_killer.log 2>&1
È importante regolare attentamente i criteri e le soglie per evitare di terminare processi importanti del sistema in modo non intenzionale.