Middle+
Co je long killer?
sobes.tech AI
Odpověď od AI
Long Killer – uživatelský skript v systému Unix/Linux určený k vyhledávání a nucenému ukončení procesů, které běží déle než stanovenou dobu. Obvykle se používá k řízení zdrojů a prevenci zamrznutí systému. Může být implementován v různých skriptovacích jazycích, jako je Bash nebo Python.
Princip fungování:
- Určení seznamu spuštěných procesů (například pomocí
ps). - Filtrace procesů podle různých kritérií (uživatel, název příkazu atd.).
- Určení doby běhu každého zájmového procesu.
- Porovnání doby běhu s předem stanovenou prahovou hodnotou.
- Odeslání signálu ukončení (například
SIGTERMneboSIGKILL) procesům, které překročily práh.
Příklad implementace v Bash:
#!/bin/bash
# Prahový čas v sekundách
THRESHOLD_SECONDS=3600 # 1 hodina
# Název procesu k hledání. Nechte prázdné '', pokud chcete hledat všechny procesy uživatele
PROCESS_NAME=""
# Uživatel, od jehož jména jsou procesy spuštěny. Nechte prázdné '', pokud chcete hledat všechny uživatele
USER=""
# Vynechat procesy podle názvu (oddělené mezerou)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"
# Získání seznamu procesů, jejich doby běhu (ET), PID, název příkazu a uživatele
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
# Převod doby běhu na sekundy
SECS=0
if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Dny-hodiny:minuty:vteřiny
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 # Hodiny:minuty:vteřiny
SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Minuty:vteřiny
SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
elif [[ "$ET" =~ ([0-9]+) ]]; then # Vteřiny
SECS=${BASH_REMATCH[1]}
fi
# Kontrola podmínek pro ukončení
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
# Kontrola seznamu výjimek
for EXCLUDE in $EXCLUDE_PROCESSES; do
if [[ "$CMD" == *"$EXCLUDE"* ]]; then
KILL=false
break
fi
done
# Ukončení procesu, pokud jsou splněny všechny podmínky a nejde o tento skript
if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
echo "Ukončuji proces $PID ($CMD) běžící $ET"
kill $PID # Může být použit kill -9 $PID pro nucené ukončení
fi
done
Tento skript lze spouštět naplánovaně, například přes Crontab.
# Spouštět každou minutu
* * * * * /path/to/your/long_killer.sh >> /var/log/long_killer.log 2>&1
Je důležité pečlivě nastavit kritéria a prahové hodnoty, aby nedošlo k neúmyslnému ukončení důležitých systémových procesů.