Sobes.tech
Middle+

Mi az a long killer?

sobes.tech MI

Válasz az MI-től

Long Killer – egy Unix/Linux rendszerben használt felhasználói szkript, amely a hosszabb ideig futó folyamatok keresésére és kényszerített befejezésére szolgál. Általában erőforrás-kezelésre és a rendszer lefagyásának megelőzésére használják. Különböző szkriptnyelveken valósítható meg, például Bash vagy Python.

Működési elv:

  1. A futó folyamatok listájának meghatározása (például ps segítségével).
  2. A folyamatok szűrése különböző kritériumok szerint (felhasználó, parancs neve stb.).
  3. Az egyes érintett folyamatok futási idejének meghatározása.
  4. A futási idő összehasonlítása egy előre meghatározott küszöbértékkel.
  5. A küszöböt meghaladó folyamatok leállítási jelének (például SIGTERM vagy SIGKILL) küldése.

Bash példával:

#!/bin/bash

# Küszöbérték másodpercben
THRESHOLD_SECONDS=3600 # 1 óra

# A keresett folyamat neve. Hagyja üresen '', ha minden folyamatot keres
PROCESS_NAME=""

# A felhasználó, aki a folyamatokat indította. Hagyja üresen '', ha minden felhasználó folyamatát keresi
USER=""

# Kizáró folyamatok neve (szóközzel elválasztva)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"

# A folyamatok listájának lekérése, futási idő (ET), PID, parancs neve és felhasználó
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
    # A futási idő másodpercre való átalakítása
    SECS=0
    if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Nap-óra:perc:mp
        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 # Óra:perc:mp
        SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
    elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Perc:mp
        SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
    elif [[ "$ET" =~ ([0-9]+) ]]; then # Másodperc
        SECS=${BASH_REMATCH[1]}
    fi

    # A leállítás feltételeinek ellenőrzése
    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

    # Kizáró listák ellenőrzése
    for EXCLUDE in $EXCLUDE_PROCESSES; do
        if [[ "$CMD" == *"$EXCLUDE"* ]]; then
            KILL=false
            break
        fi
    done

    # A folyamat leállítása, ha minden feltétel teljesül és nem ez a saját szkript
    if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
        echo "Folyamat leállítása $PID ($CMD), futási idő: $ET"
        kill $PID # Használhatja a kill -9 $PID parancsot kényszerített leállításhoz
    fi
done

Ezt a szkriptet ütemezetten is futtathatja, például Cron segítségével.

# Minden percben futtatás
* * * * * /path/to/your/long_killer.sh >> /var/log/long_killer.log 2>&1

Fontos, hogy gondosan állítsa be a kritériumokat és küszöbértékeket, hogy elkerülje a fontos rendszerfolyamatok véletlen leállítását.