Sobes.tech
Middle+

Čo je long killer?

sobes.tech AI

Odpoveď od AI

Long Killer – používateľský skript v systéme Unix/Linux určený na vyhľadávanie a nútené ukončenie procesov, ktoré bežia dlhšie ako stanovený čas. Zvyčajne sa používa na správu zdrojov a prevenciu zamrznutia systému. Môže byť implementovaný v rôznych skriptovacích jazykoch, ako je Bash alebo Python.

Princíp fungovania:

  1. Určenie zoznamu spustených procesov (napríklad pomocou ps).
  2. Filtrácia procesov podľa rôznych kritérií (používateľ, názov príkazu atď.).
  3. Určenie doby behu každého zaujímavého procesu.
  4. Porovnanie doby behu s preddefinovaným prahom.
  5. Odoslanie signálu na ukončenie (napríklad SIGTERM alebo SIGKILL) procesom, ktoré prekročili prah.

Príklad implementácie v Bash:

#!/bin/bash

# Prahový čas v sekundách
THRESHOLD_SECONDS=3600 # 1 hodina

# Názov procesu na vyhľadanie. Nechajte prázdne '', ak chcete hľadať všetky procesy používateľa
PROCESS_NAME=""

# Používateľ, od ktorého mena sú procesy spustené. Nechajte prázdne '', ak chcete hľadať procesy všetkých používateľov
USER=""

# Vylúčiť procesy podľa názvu (oddelené medzerou)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"

# Získanie zoznamu procesov, ich doby práce (ET), PID, názov príkazu a používateľa
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
    # Prevod doby práce na sekundy
    SECS=0
    if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Dni-časy:minúty:vteřiny
        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 # Časy:minúty:vteřiny
        SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
    elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Minúty:vteřiny
        SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
    elif [[ "$ET" =~ ([0-9]+) ]]; then # Vteřiny
        SECS=${BASH_REMATCH[1]}
    fi

    # Kontrola podmienok na ukončenie
    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

    # Kontrola zoznamu výnimiek
    for EXCLUDE in $EXCLUDE_PROCESSES; do
        if [[ "$CMD" == *"$EXCLUDE"* ]]; then
            KILL=false
            break
        fi
    done

    # Ukončenie procesu, ak sú splnené všetky podmienky a nie je to tento skript
    if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
        echo "Ukončujem proces $PID ($CMD), ktorý beží od $ET"
        kill $PID # Môže byť použitý kill -9 $PID pre nútené ukončenie
    fi
done

Tento skript môžete spustiť podľa plánu, napríklad cez Crontab.

# Spúšťať každú minútu
* * * * * /path/to/your/long_killer.sh >> /var/log/long_killer.log 2>&1

Je dôležité starostlivo nastaviť kritériá a prahové hodnoty, aby nedošlo k neúmyselnému ukončeniu dôležitých systémových procesov.