Sobes.tech
Middle+

Ce este un long killer?

sobes.tech AI

Răspuns de la AI

Long Killer este un script personalizat pentru sistemele Unix/Linux, conceput pentru a căuta și termina forțat procesele care rulează mai mult decât timpul stabilit. De obicei, este folosit pentru gestionarea resurselor și prevenirea blocării sistemului. Poate fi implementat în diverse limbaje de scripting, precum Bash sau Python.

Principiul de funcționare:

  1. Identificarea listei de procese în execuție (de exemplu, cu ps).
  2. Filtrarea proceselor după diferite criterii (utilizator, numele comenzii etc.).
  3. Determinarea duratei fiecărui proces de interes.
  4. Compararea duratei cu o valoare prag predefinită.
  5. Trimiterea unui semnal de terminare (de exemplu, SIGTERM sau SIGKILL) proceselor care depășesc acest prag.

Exemplu de implementare în Bash:

#!/bin/bash

# Timpul prag în secunde
THRESHOLD_SECONDS=3600 # 1 oră

# Numele procesului de căutat. Lăsați gol '', dacă doriți să căutați toate procesele utilizatorului
PROCESS_NAME=""

# Utilizatorul care rulează procesele. Lăsați gol '', dacă doriți să căutați procesele tuturor utilizatorilor
USER=""

# Exclude procesele după nume (separate prin spațiu)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"

# Obțineți lista de procese, timpul lor de funcționare (ET), PID, numele comenzii și utilizatorul
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
    # Convertiți timpul de funcționare în secunde
    SECS=0
    if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # zile-ore:minut:secundă
        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:minut:secundă
        SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
    elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # minut:secundă
        SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
    elif [[ "$ET" =~ ([0-9]+) ]]; then # secunde
        SECS=${BASH_REMATCH[1]}
    fi

    # Verificați condițiile pentru 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

    # Verificați lista de excludere
    for EXCLUDE in $EXCLUDE_PROCESSES; do
        if [[ "$CMD" == *"$EXCLUDE"* ]]; then
            KILL=false
            break
        fi
    done

    # Încheie procesul dacă toate condițiile sunt îndeplinite și nu este acest script
    if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
        echo "Terminarea procesului $PID ($CMD) care rulează de $ET"
        kill $PID # Se poate folosi kill -9 $PID pentru forțare
    fi
done

Acest script poate fi programat să ruleze periodic, de exemplu, prin Crontab.

# Rulare la fiecare minut
* * * * * /cale/catre/long_killer.sh >> /var/log/long_killer.log 2>&1

Este important să ajustați cu grijă criteriile și pragurile pentru a evita terminarea neintenționată a proceselor importante ale sistemului.