Sobes.tech
Middle+

Mis on long killer?

sobes.tech AI

Vastus AI-lt

Long Killer – kasutaja skript Unix/Linux süsteemis, mis on mõeldud otsima ja sundima lõpetama protsesse, mis töötavad kauem kui määratud aeg. Tavaliselt kasutatakse ressurside haldamiseks ja süsteemi hangimise vältimiseks. Seda saab rakendada erinevates skriptikeeltes, näiteks Bash või Python.

Tööpõhimõte:

  1. Aktiivsete protsesside nimekirja määramine (näiteks ps abil).
  2. Protsesside filtreerimine erinevate kriteeriumide järgi (kasutaja, käskluse nimi jne).
  3. Iga huvipakkuva protsessi tööaja määramine.
  4. Tööaja võrdlemine eelnevalt määratud piiriga.
  5. Signaali saatmine protsessidele, mis ületavad piiri (SIGTERM või SIGKILL).

Näide Bashis:

#!/bin/bash

# Piirang sekundites
THRESHOLD_SECONDS=3600 # 1 tund

# Otsitava protsessi nimi. Jäta tühjaks '', kui soovid otsida kõiki kasutaja protsesse
PROCESS_NAME=""

# Kasutaja, kelle nimel protsessid on käivitatud. Jäta tühjaks '', kui soovid otsida kõiki kasutajaid
USER=""

# Välista protsessid nime järgi (eraldatud tühikuga)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"

# Protsesside nimekiri, nende tööaeg (ET), PID, käskluse nimi ja kasutaja
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
    # Muuta tööaeg sekunditeks
    SECS=0
    if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Päevad-ajad:minutid:sekundid
        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 # Kellad:minutid:sekundid
        SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
    elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Minutid:sekundid
        SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
    elif [[ "$ET" =~ ([0-9]+) ]]; then # Sekundid
        SECS=${BASH_REMATCH[1]}
    fi

    # Kontrolli lõpetamise tingimusi
    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

    # Kontrolli välistuste nimekirja
    for EXCLUDE in $EXCLUDE_PROCESSES; do
        if [[ "$CMD" == *"$EXCLUDE"* ]]; then
            KILL=false
            break
        fi
    done

    # Protsessi lõpetamine, kui kõik tingimused on täidetud ja see ei ole käesolev skript
    if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
        echo "Lõpetan protsessi $PID ($CMD), mis töötas $ET"
        kill $PID # Võib kasutada ka kill -9 $PID jõuga lõpetamiseks
    fi
done

Seda skripti saab ajastada, näiteks Crontabi abil.

# Käivitatakse iga minuti jooksul
* * * * * /path/to/your/long_killer.sh >> /var/log/long_killer.log 2>&1

Oluline on hoolikalt seadistada kriteeriumid ja piirid, et vältida oluliste süsteemiprotsesside juhuslikku lõpetamist.