Sobes.tech
Middle+

Kas yra long killer?

sobes.tech AI

Atsakymas iš AI

Long Killer – naudotojo scenarijus Unix/Linux sistemoje, skirtas ieškoti ir priverstinai nutraukti procesus, kurie veikia ilgiau nei nustatytas laikas. Paprastai naudojamas išteklių valdymui ir sistemos užšalimo prevencijai. Gali būti įgyvendintas įvairiais scenarijų kalbomis, tokiomis kaip Bash arba Python.

Veikimo principas:

  1. Nustatyti vykdomų procesų sąrašą (pavyzdžiui, naudojant ps).
  2. Filtruoti procesus pagal įvairius kriterijus (vartotojas, komandos pavadinimas ir kt.).
  3. Nustatyti kiekvieno proceso darbo trukmę.
  4. Palyginti darbo trukmę su iš anksto nustatyta riba.
  5. Siųsti signalą proceso nutraukimui (pavyzdžiui, SIGTERM arba SIGKILL), jei jis viršijo ribą.

Pavyzdys Bash kalba:

#!/bin/bash

# Riba sekundėmis
THRESHOLD_SECONDS=3600 # 1 valanda

# Procesų pavadinimas paieškai. Palikite tuščią '', jei norite ieškoti visų vartotojo procesų
PROCESS_NAME=""

# Vartotojas, iš kurio vardo yra paleisti procesai. Palikite tuščią '', jei norite ieškoti visų vartotojų
USER=""

# Išskirti procesus pagal pavadinimą (atskirtą tarpu)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"

# Gauti procesų sąrašą, jų darbo laiką (ET), PID, komandos pavadinimą ir vartotoją
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
    # Konvertuoti darbo laiką į sekundes
    SECS=0
    if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Dienos-laikai:minutės:sekundės
        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 # Laikai: minutės: sekundės
        SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
    elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Minutės: sekundės
        SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
    elif [[ "$ET" =~ ([0-9]+) ]]; then # Sekundės
        SECS=${BASH_REMATCH[1]}
    fi

    # Patikrinti sąlygas nutraukti
    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

    # Patikrinti išimčių sąrašą
    for EXCLUDE in $EXCLUDE_PROCESSES; do
        if [[ "$CMD" == *"$EXCLUDE"* ]]; then
            KILL=false
            break
        fi
    done

    # Nutraukti procesą, jei visi kriterijai tenkinami ir tai nėra šis scenarijus
    if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
        echo "Nutraukiu procesą $PID ($CMD), kuris veikia $ET"
        kill $PID # Galima naudoti kill -9 $PID priverstinai nutraukti
    fi
done

Šį scenarijų galima paleisti pagal grafiką, pavyzdžiui, naudojant Crontab.

# Paleisti kas minutę
* * * * * /path/to/your/long_killer.sh >> /var/log/long_killer.log 2>&1

Svarbu kruopščiai nustatyti kriterijus ir ribas, kad išvengtumėte svarbių sisteminių procesų netyčinio nutraukimo.