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:
- Identificatie van de lijst met lopende processen (bijvoorbeeld met
ps). - Filteren van processen op basis van verschillende criteria (gebruiker, commando-naam, etc.).
- Bepaling van de duur van elk proces van belang.
- Vergelijking van de duur met een vooraf gedefinieerde drempelwaarde.
- Verzenden van een beëindigingssignaal (bijvoorbeeld
SIGTERMofSIGKILL) 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.