Middle+
Mi az a long killer?
sobes.tech MI
Válasz az MI-től
Long Killer – egy Unix/Linux rendszerben használt felhasználói szkript, amely a hosszabb ideig futó folyamatok keresésére és kényszerített befejezésére szolgál. Általában erőforrás-kezelésre és a rendszer lefagyásának megelőzésére használják. Különböző szkriptnyelveken valósítható meg, például Bash vagy Python.
Működési elv:
- A futó folyamatok listájának meghatározása (például
pssegítségével). - A folyamatok szűrése különböző kritériumok szerint (felhasználó, parancs neve stb.).
- Az egyes érintett folyamatok futási idejének meghatározása.
- A futási idő összehasonlítása egy előre meghatározott küszöbértékkel.
- A küszöböt meghaladó folyamatok leállítási jelének (például
SIGTERMvagySIGKILL) küldése.
Bash példával:
#!/bin/bash
# Küszöbérték másodpercben
THRESHOLD_SECONDS=3600 # 1 óra
# A keresett folyamat neve. Hagyja üresen '', ha minden folyamatot keres
PROCESS_NAME=""
# A felhasználó, aki a folyamatokat indította. Hagyja üresen '', ha minden felhasználó folyamatát keresi
USER=""
# Kizáró folyamatok neve (szóközzel elválasztva)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"
# A folyamatok listájának lekérése, futási idő (ET), PID, parancs neve és felhasználó
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
# A futási idő másodpercre való átalakítása
SECS=0
if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Nap-óra:perc:mp
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 # Óra:perc:mp
SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Perc:mp
SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
elif [[ "$ET" =~ ([0-9]+) ]]; then # Másodperc
SECS=${BASH_REMATCH[1]}
fi
# A leállítás feltételeinek ellenőrzése
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
# Kizáró listák ellenőrzése
for EXCLUDE in $EXCLUDE_PROCESSES; do
if [[ "$CMD" == *"$EXCLUDE"* ]]; then
KILL=false
break
fi
done
# A folyamat leállítása, ha minden feltétel teljesül és nem ez a saját szkript
if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
echo "Folyamat leállítása $PID ($CMD), futási idő: $ET"
kill $PID # Használhatja a kill -9 $PID parancsot kényszerített leállításhoz
fi
done
Ezt a szkriptet ütemezetten is futtathatja, például Cron segítségével.
# Minden percben futtatás
* * * * * /path/to/your/long_killer.sh >> /var/log/long_killer.log 2>&1
Fontos, hogy gondosan állítsa be a kritériumokat és küszöbértékeket, hogy elkerülje a fontos rendszerfolyamatok véletlen leállítását.