Sobes.tech
Middle+

Šta je long killer?

sobes.tech АИ

Одговор од АИ

Long Killer – korisnički skript u Unix/Linux sistemu namenjen za pretraživanje i prinudno zatvaranje procesa koji rade duže od zadanog vremena. Obično se koristi za upravljanje resursima i sprečavanje zamrzavanja sistema. Može biti implementiran u različitim skript jezicima, kao što su Bash ili Python.

Princip rada:

  1. Određivanje liste pokrenutih procesa (npr. pomoću ps).
  2. Filtriranje procesa prema različitim kriterijumima (korisnik, ime komande itd.).
  3. Određivanje trajanja rada svakog od interesa procesa.
  4. Poređenje trajanja rada sa unapred definisanom granicom.
  5. Slanje signala za zatvaranje (npr. SIGTERM ili SIGKILL) procesima koji su prešli granicu.

Primer implementacije u Bash-u:

#!/bin/bash

# Granica u sekundama
THRESHOLD_SECONDS=3600 # 1 sat

# Ime procesa za pretragu. Ostavite prazno '', ako želite da tražite sve procese korisnika
PROCESS_NAME=""

# Korisnik čiji su procesi pokrenuti. Ostavite prazno '', ako želite da tražite procese svih korisnika
USER=""

# Izuzeti procese po imenu (razmakom odvojeni)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"

# Dobijanje liste procesa, njihovo vreme rada (ET), PID, ime komande i korisnik
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
    # Pretvaranje vremena rada u sekunde
    SECS=0
    if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Dani-časovi:minuti:sekundi
        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 # Časovi:minuti:sekundi
        SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
    elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Minuti:sekundi
        SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
    elif [[ "$ET" =~ ([0-9]+) ]]; then # Sekundi
        SECS=${BASH_REMATCH[1]}
    fi

    # Provera uslova za zatvaranje
    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

    # Provera liste izuzetaka
    for EXCLUDE in $EXCLUDE_PROCESSES; do
        if [[ "$CMD" == *"$EXCLUDE"* ]]; then
            KILL=false
            break
        fi
    done

    # Zatvaranje procesa ako su svi uslovi ispunjeni i ovo nije trenutni skript
    if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
        echo "Zatvaranje procesa $PID ($CMD) koji traje $ET"
        kill $PID # Može se koristiti kill -9 $PID za prinudno zatvaranje
    fi
done

Ovaj skript možete pokrenuti po rasporedu, na primer putem Crontaba.

# Pokretanje svakog minuta
* * * * * /path/to/your/long_killer.sh >> /var/log/long_killer.log 2>&1

Važno je pažljivo podesiti kriterijume i pragove kako biste izbegli nenamerno zatvaranje važnih sistemskih procesa.