Sobes.tech
Middle+

Wat is een long killer?

sobes.tech AI

Antwoord van AI

Long Killer is een aangepast script voor Unix/Linux-systemen, ontworpen om processen te zoeken en geforceerd te beëindigen die langer duren dan de ingestelde tijd. Het wordt meestal gebruikt voor resourcebeheer en het voorkomen van systeemvastlopen. Het kan worden geïmplementeerd in verschillende scripttalen zoals Bash of Python.

Werking:

  1. Identificatie van de lijst met lopende processen (bijvoorbeeld met ps).
  2. Filteren van processen op basis van verschillende criteria (gebruiker, commando-naam, etc.).
  3. Bepaling van de duur van elk proces van belang.
  4. Vergelijking van de duur met een vooraf gedefinieerde drempelwaarde.
  5. Verzenden van een beëindigingssignaal (bijvoorbeeld SIGTERM of SIGKILL) naar processen die deze drempel overschrijden.

Voorbeeld van implementatie in Bash:

#!/bin/bash

# Drempelduur in seconden
THRESHOLD_SECONDS=3600 # 1 uur

# Naam van het proces om te zoeken. Laat leeg '', als je alle processen van de gebruiker wilt zoeken
PROCESS_NAME=""

# Gebruiker die de processen uitvoert. Laat leeg '', als je processen van alle gebruikers wilt zoeken
USER=""

# Processen uitsluiten op naam (gescheiden door spaties)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"

# Verkrijg de lijst van processen, hun werktijd (ET), PID, commando en gebruiker
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
    # Converteer werktijd naar seconden
    SECS=0
    if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Dagen-uren:minuten:seconden
        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 # Uren:minuten:seconden
        SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
    elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Minuten:seconden
        SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
    elif [[ "$ET" =~ ([0-9]+) ]]; then # Seconden
        SECS=${BASH_REMATCH[1]}
    fi

    # Controleer of de voorwaarden voor beëindiging voldaan zijn
    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

    # Controleer de uitsluitingslijst
    for EXCLUDE in $EXCLUDE_PROCESSES; do
        if [[ "$CMD" == *"$EXCLUDE"* ]]; then
            KILL=false
            break
        fi
    done

    # Beëindig het proces als alle voorwaarden voldaan zijn en het niet dit script is
    if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
        echo "Beëindigen proces $PID ($CMD) dat al $ET draait"
        kill $PID # Voor geforceerde beëindiging kan kill -9 $PID gebruikt worden
    fi
done

Dit script kan periodiek worden uitgevoerd, bijvoorbeeld via Crontab.

# Elke minuut uitvoeren
* * * * * /pad/naar/je/long_killer.sh >> /var/log/long_killer.log 2>&1

Het is belangrijk om de criteria en drempels zorgvuldig af te stemmen om onbedoeld beëindigen van belangrijke systeemprocessen te voorkomen.