Middle+
Čo je long killer?
sobes.tech AI
Odpoveď od AI
Long Killer – používateľský skript v systéme Unix/Linux určený na vyhľadávanie a nútené ukončenie procesov, ktoré bežia dlhšie ako stanovený čas. Zvyčajne sa používa na správu zdrojov a prevenciu zamrznutia systému. Môže byť implementovaný v rôznych skriptovacích jazykoch, ako je Bash alebo Python.
Princíp fungovania:
- Určenie zoznamu spustených procesov (napríklad pomocou
ps). - Filtrácia procesov podľa rôznych kritérií (používateľ, názov príkazu atď.).
- Určenie doby behu každého zaujímavého procesu.
- Porovnanie doby behu s preddefinovaným prahom.
- Odoslanie signálu na ukončenie (napríklad
SIGTERMaleboSIGKILL) procesom, ktoré prekročili prah.
Príklad implementácie v Bash:
#!/bin/bash
# Prahový čas v sekundách
THRESHOLD_SECONDS=3600 # 1 hodina
# Názov procesu na vyhľadanie. Nechajte prázdne '', ak chcete hľadať všetky procesy používateľa
PROCESS_NAME=""
# Používateľ, od ktorého mena sú procesy spustené. Nechajte prázdne '', ak chcete hľadať procesy všetkých používateľov
USER=""
# Vylúčiť procesy podľa názvu (oddelené medzerou)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"
# Získanie zoznamu procesov, ich doby práce (ET), PID, názov príkazu a používateľa
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
# Prevod doby práce na sekundy
SECS=0
if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Dni-časy:minúty: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 # Časy:minúty:vteřiny
SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Minúty:vteřiny
SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
elif [[ "$ET" =~ ([0-9]+) ]]; then # Vteřiny
SECS=${BASH_REMATCH[1]}
fi
# Kontrola podmienok na ukončenie
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 zoznamu výnimiek
for EXCLUDE in $EXCLUDE_PROCESSES; do
if [[ "$CMD" == *"$EXCLUDE"* ]]; then
KILL=false
break
fi
done
# Ukončenie procesu, ak sú splnené všetky podmienky a nie je to tento skript
if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
echo "Ukončujem proces $PID ($CMD), ktorý beží od $ET"
kill $PID # Môže byť použitý kill -9 $PID pre nútené ukončenie
fi
done
Tento skript môžete spustiť podľa plánu, napríklad cez Crontab.
# Spúšťať každú minútu
* * * * * /path/to/your/long_killer.sh >> /var/log/long_killer.log 2>&1
Je dôležité starostlivo nastaviť kritériá a prahové hodnoty, aby nedošlo k neúmyselnému ukončeniu dôležitých systémových procesov.