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

  1. Identificazione della lista dei processi in esecuzione (ad esempio, usando ps).
  2. Filtraggio dei processi secondo diversi criteri (utente, nome del comando, ecc.).
  3. Determinazione della durata di ogni processo di interesse.
  4. Confronto della durata con un valore soglia predefinito.
  5. Invio di un segnale di terminazione (ad esempio, SIGTERM o SIGKILL) 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.