Middle+
Ce este un long killer?
sobes.tech AI
Răspuns de la AI
Long Killer este un script personalizat pentru sistemele Unix/Linux, conceput pentru a căuta și termina forțat procesele care rulează mai mult decât timpul stabilit. De obicei, este folosit pentru gestionarea resurselor și prevenirea blocării sistemului. Poate fi implementat în diverse limbaje de scripting, precum Bash sau Python.
Principiul de funcționare:
- Identificarea listei de procese în execuție (de exemplu, cu
ps). - Filtrarea proceselor după diferite criterii (utilizator, numele comenzii etc.).
- Determinarea duratei fiecărui proces de interes.
- Compararea duratei cu o valoare prag predefinită.
- Trimiterea unui semnal de terminare (de exemplu,
SIGTERMsauSIGKILL) proceselor care depășesc acest prag.
Exemplu de implementare în Bash:
#!/bin/bash
# Timpul prag în secunde
THRESHOLD_SECONDS=3600 # 1 oră
# Numele procesului de căutat. Lăsați gol '', dacă doriți să căutați toate procesele utilizatorului
PROCESS_NAME=""
# Utilizatorul care rulează procesele. Lăsați gol '', dacă doriți să căutați procesele tuturor utilizatorilor
USER=""
# Exclude procesele după nume (separate prin spațiu)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"
# Obțineți lista de procese, timpul lor de funcționare (ET), PID, numele comenzii și utilizatorul
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
# Convertiți timpul de funcționare în secunde
SECS=0
if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # zile-ore:minut:secundă
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 # ore:minut:secundă
SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # minut:secundă
SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
elif [[ "$ET" =~ ([0-9]+) ]]; then # secunde
SECS=${BASH_REMATCH[1]}
fi
# Verificați condițiile pentru terminare
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
# Verificați lista de excludere
for EXCLUDE in $EXCLUDE_PROCESSES; do
if [[ "$CMD" == *"$EXCLUDE"* ]]; then
KILL=false
break
fi
done
# Încheie procesul dacă toate condițiile sunt îndeplinite și nu este acest script
if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
echo "Terminarea procesului $PID ($CMD) care rulează de $ET"
kill $PID # Se poate folosi kill -9 $PID pentru forțare
fi
done
Acest script poate fi programat să ruleze periodic, de exemplu, prin Crontab.
# Rulare la fiecare minut
* * * * * /cale/catre/long_killer.sh >> /var/log/long_killer.log 2>&1
Este important să ajustați cu grijă criteriile și pragurile pentru a evita terminarea neintenționată a proceselor importante ale sistemului.