Sobes.tech
Middle+

Was ist ein Long Killer?

sobes.tech KI

Antwort von AI

Long Killer ist ein benutzerdefiniertes Skript in Unix/Linux-Systemen, das dazu dient, Prozesse zu suchen und zwangsweise zu beenden, die länger laufen als die festgelegte Zeit. Es wird typischerweise zur Ressourcenverwaltung und zur Verhinderung von Systemhängern verwendet. Es kann in verschiedenen Skriptsprachen wie Bash oder Python implementiert werden.

Funktionsprinzip:

  1. Ermittlung der laufenden Prozesse (z.B. mit ps).
  2. Filtern der Prozesse nach verschiedenen Kriterien (Benutzer, Befehlsname usw.).
  3. Bestimmung der Laufzeit jedes interessierenden Prozesses.
  4. Vergleich der Laufzeit mit einem vordefinierten Schwellenwert.
  5. Senden eines Beendigungssignals (z.B. SIGTERM oder SIGKILL) an Prozesse, die den Schwellenwert überschreiten.

Beispiel für eine Bash-Implementierung:

#!/bin/bash

# Schwellenzeit in Sekunden
THRESHOLD_SECONDS=3600 # 1 Stunde

# Name des Prozesses zur Suche. Leer lassen '', wenn alle Prozesse des Benutzers gesucht werden sollen
PROCESS_NAME=""

# Benutzer, unter dem die Prozesse laufen. Leer lassen '', wenn Prozesse aller Benutzer gesucht werden sollen
USER=""

# Prozesse ausschließen (durch Leerzeichen getrennt)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"

# Liste der Prozesse, deren Laufzeit (ET), PID, Befehl und Benutzer
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
    # Laufzeit in Sekunden umrechnen
    SECS=0
    if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Tage-Stunden:Minuten:Sekunden
        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 # Stunden:Minuten:Sekunden
        SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
    elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Minuten:Sekunden
        SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
    elif [[ "$ET" =~ ([0-9]+) ]]; then # Sekunden
        SECS=${BASH_REMATCH[1]}
    fi

    # Bedingungen zum Beenden prüfen
    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

    # Ausschlussliste prüfen
    for EXCLUDE in $EXCLUDE_PROCESSES; do
        if [[ "$CMD" == *"$EXCLUDE"* ]]; then
            KILL=false
            break
        fi
    done

    # Prozess beenden, wenn alle Bedingungen erfüllt sind und es nicht dieses Skript ist
    if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
        echo "Prozess $PID ($CMD) wird beendet, läuft seit $ET"
        kill $PID # Für Zwangsbeendigung kann auch kill -9 $PID verwendet werden
    fi
done

Dieses Skript kann periodisch ausgeführt werden, z.B. via Crontab.

# Alle Minute ausführen
* * * * * /pfad/zu/deinem/long_killer.sh >> /var/log/long_killer.log 2>&1

Es ist wichtig, die Kriterien und Schwellenwerte sorgfältig anzupassen, um unbeabsichtigtes Beenden wichtiger Systemprozesse zu vermeiden.