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:
- Ermittlung der laufenden Prozesse (z.B. mit
ps). - Filtern der Prozesse nach verschiedenen Kriterien (Benutzer, Befehlsname usw.).
- Bestimmung der Laufzeit jedes interessierenden Prozesses.
- Vergleich der Laufzeit mit einem vordefinierten Schwellenwert.
- Senden eines Beendigungssignals (z.B.
SIGTERModerSIGKILL) 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.