Middle+
Šta je long killer?
sobes.tech АИ
Одговор од АИ
Long Killer – korisnički skript u Unix/Linux sistemu namenjen za pretraživanje i prinudno zatvaranje procesa koji rade duže od zadanog vremena. Obično se koristi za upravljanje resursima i sprečavanje zamrzavanja sistema. Može biti implementiran u različitim skript jezicima, kao što su Bash ili Python.
Princip rada:
- Određivanje liste pokrenutih procesa (npr. pomoću
ps). - Filtriranje procesa prema različitim kriterijumima (korisnik, ime komande itd.).
- Određivanje trajanja rada svakog od interesa procesa.
- Poređenje trajanja rada sa unapred definisanom granicom.
- Slanje signala za zatvaranje (npr.
SIGTERMiliSIGKILL) procesima koji su prešli granicu.
Primer implementacije u Bash-u:
#!/bin/bash
# Granica u sekundama
THRESHOLD_SECONDS=3600 # 1 sat
# Ime procesa za pretragu. Ostavite prazno '', ako želite da tražite sve procese korisnika
PROCESS_NAME=""
# Korisnik čiji su procesi pokrenuti. Ostavite prazno '', ako želite da tražite procese svih korisnika
USER=""
# Izuzeti procese po imenu (razmakom odvojeni)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"
# Dobijanje liste procesa, njihovo vreme rada (ET), PID, ime komande i korisnik
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
# Pretvaranje vremena rada u sekunde
SECS=0
if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Dani-časovi:minuti:sekundi
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 # Časovi:minuti:sekundi
SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Minuti:sekundi
SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
elif [[ "$ET" =~ ([0-9]+) ]]; then # Sekundi
SECS=${BASH_REMATCH[1]}
fi
# Provera uslova za zatvaranje
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
# Provera liste izuzetaka
for EXCLUDE in $EXCLUDE_PROCESSES; do
if [[ "$CMD" == *"$EXCLUDE"* ]]; then
KILL=false
break
fi
done
# Zatvaranje procesa ako su svi uslovi ispunjeni i ovo nije trenutni skript
if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
echo "Zatvaranje procesa $PID ($CMD) koji traje $ET"
kill $PID # Može se koristiti kill -9 $PID za prinudno zatvaranje
fi
done
Ovaj skript možete pokrenuti po rasporedu, na primer putem Crontaba.
# Pokretanje svakog minuta
* * * * * /path/to/your/long_killer.sh >> /var/log/long_killer.log 2>&1
Važno je pažljivo podesiti kriterijume i pragove kako biste izbegli nenamerno zatvaranje važnih sistemskih procesa.