Sobes.tech
Middle+

Czym jest long killer?

sobes.tech AI

Odpowiedź od AI

Long Killer to niestandardowy skrypt w systemach Unix/Linux, zaprojektowany do wyszukiwania i wymuszania zakończenia procesów działających dłużej niż określony czas. Zazwyczaj służy do zarządzania zasobami i zapobiegania zawieszaniu się systemu. Może być zaimplementowany w różnych językach skryptowych, takich jak Bash czy Python.

Zasada działania:

  1. Identyfikacja listy uruchomionych procesów (np. za pomocą ps).
  2. Filtrowanie procesów według różnych kryteriów (użytkownik, nazwa polecenia itp.).
  3. Określenie czasu działania każdego interesującego procesu.
  4. Porównanie czasu działania z wcześniej zdefiniowanym progiem.
  5. Wysłanie sygnału zakończenia (np. SIGTERM lub SIGKILL) procesom przekraczającym ten próg.

Przykład implementacji w Bash:

#!/bin/bash

# Próg czasowy w sekundach
THRESHOLD_SECONDS=3600 # 1 godzina

# Nazwa procesu do wyszukania. Pozostaw puste '', jeśli chcesz szukać wszystkich procesów użytkownika
PROCESS_NAME=""

# Użytkownik uruchamiający procesy. Pozostaw puste '', jeśli chcesz szukać procesów wszystkich użytkowników
USER=""

# Wykluczenie procesów po nazwie (oddzielone spacjami)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"

# Pobieranie listy procesów, ich czasu działania (ET), PID, nazwy polecenia i użytkownika
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
    # Konwersja czasu działania na sekundy
    SECS=0
    if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # dni-hh:mm:ss
        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 # hh:mm:ss
        SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
    elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # mm:ss
        SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
    elif [[ "$ET" =~ ([0-9]+) ]]; then # sekundy
        SECS=${BASH_REMATCH[1]}
    fi

    # Sprawdzanie warunków do zakończenia
    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

    # Sprawdzanie listy wykluczeń
    for EXCLUDE in $EXCLUDE_PROCESSES; do
        if [[ "$CMD" == *"$EXCLUDE"* ]]; then
            KILL=false
            break
        fi
    done

    # Zakończenie procesu, jeśli wszystkie warunki są spełnione i to nie jest ten skrypt
    if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
        echo "Zabijanie procesu $PID ($CMD) działającego od $ET"
        kill $PID # Można użyć kill -9 $PID do wymuszenia zakończenia
    fi
done

Skrypt można uruchamiać cyklicznie, np. za pomocą Crontab.

# Uruchamiać co minutę
* * * * * /ścieżka/do/twojego/long_killer.sh >> /var/log/long_killer.log 2>&1

Ważne jest, aby starannie dostosować kryteria i progi, aby uniknąć niezamierzonego zakończenia ważnych procesów systemowych.