Middle+
Kas yra long killer?
sobes.tech AI
Atsakymas iš AI
Long Killer – naudotojo scenarijus Unix/Linux sistemoje, skirtas ieškoti ir priverstinai nutraukti procesus, kurie veikia ilgiau nei nustatytas laikas. Paprastai naudojamas išteklių valdymui ir sistemos užšalimo prevencijai. Gali būti įgyvendintas įvairiais scenarijų kalbomis, tokiomis kaip Bash arba Python.
Veikimo principas:
- Nustatyti vykdomų procesų sąrašą (pavyzdžiui, naudojant
ps). - Filtruoti procesus pagal įvairius kriterijus (vartotojas, komandos pavadinimas ir kt.).
- Nustatyti kiekvieno proceso darbo trukmę.
- Palyginti darbo trukmę su iš anksto nustatyta riba.
- Siųsti signalą proceso nutraukimui (pavyzdžiui,
SIGTERMarbaSIGKILL), jei jis viršijo ribą.
Pavyzdys Bash kalba:
#!/bin/bash
# Riba sekundėmis
THRESHOLD_SECONDS=3600 # 1 valanda
# Procesų pavadinimas paieškai. Palikite tuščią '', jei norite ieškoti visų vartotojo procesų
PROCESS_NAME=""
# Vartotojas, iš kurio vardo yra paleisti procesai. Palikite tuščią '', jei norite ieškoti visų vartotojų
USER=""
# Išskirti procesus pagal pavadinimą (atskirtą tarpu)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"
# Gauti procesų sąrašą, jų darbo laiką (ET), PID, komandos pavadinimą ir vartotoją
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
# Konvertuoti darbo laiką į sekundes
SECS=0
if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Dienos-laikai:minutės:sekundės
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 # Laikai: minutės: sekundės
SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Minutės: sekundės
SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
elif [[ "$ET" =~ ([0-9]+) ]]; then # Sekundės
SECS=${BASH_REMATCH[1]}
fi
# Patikrinti sąlygas nutraukti
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
# Patikrinti išimčių sąrašą
for EXCLUDE in $EXCLUDE_PROCESSES; do
if [[ "$CMD" == *"$EXCLUDE"* ]]; then
KILL=false
break
fi
done
# Nutraukti procesą, jei visi kriterijai tenkinami ir tai nėra šis scenarijus
if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
echo "Nutraukiu procesą $PID ($CMD), kuris veikia $ET"
kill $PID # Galima naudoti kill -9 $PID priverstinai nutraukti
fi
done
Šį scenarijų galima paleisti pagal grafiką, pavyzdžiui, naudojant Crontab.
# Paleisti kas minutę
* * * * * /path/to/your/long_killer.sh >> /var/log/long_killer.log 2>&1
Svarbu kruopščiai nustatyti kriterijus ir ribas, kad išvengtumėte svarbių sisteminių procesų netyčinio nutraukimo.