Middle+
Kas ir long killer?
sobes.tech AI
Atbilde no AI
Long Killer – lietotāja skripts Unix/Linux sistēmā, kas paredzēts ilgstoši darbojošu procesu meklēšanai un piespiedu pārtraukšanai. Parasti tas tiek izmantots resursu pārvaldībai un sistēmas aizsaldēšanas novēršanai. To var realizēt dažādās skriptu valodās, piemēram, Bash vai Python.
Darba princips:
- Aktīvo procesu saraksta noteikšana (piemēram, ar
ps). - Procesu filtrēšana pēc dažādiem kritērijiem (lietotājs, komandas nosaukums utt.).
- Katras interesējošās procesa darba ilguma noteikšana.
- Darba ilguma salīdzināšana ar iepriekš noteiktu slieksni.
- Signāla sūtīšana procesa pārtraukšanai (piemēram,
SIGTERMvaiSIGKILL), ja tas pārsniedz slieksni.
Bash piemērs:
#!/bin/bash
# Sliekšņa laiks sekundēs
THRESHOLD_SECONDS=3600 # 1 stunda
# Meklējama procesa nosaukums. Atstājiet tukšu '', ja vēlaties meklēt visus lietotāja procesus
PROCESS_NAME=""
# Lietotājs, kura vārdā ir uzsākti procesi. Atstājiet tukšu '', ja vēlaties meklēt visus lietotājus
USER=""
# Izslēgt procesus pēc nosaukuma (atdalīti ar space)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"
# Procesu saraksta iegūšana, to darba laiks (ET), PID, komandas nosaukums un lietotājs
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
# Pārveidot darba laiku sekundēs
SECS=0
if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Dienas-hr:min:sek
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 # Hr:min:sek
SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Min:sek
SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
elif [[ "$ET" =~ ([0-9]+) ]]; then # Sek
SECS=${BASH_REMATCH[1]}
fi
# Pārbaude, vai jāizbeidz process
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
# Izslēgšanas saraksta pārbaude
for EXCLUDE in $EXCLUDE_PROCESSES; do
if [[ "$CMD" == *"$EXCLUDE"* ]]; then
KILL=false
break
fi
done
# Procesa pārtraukšana, ja visi nosacījumi ir izpildīti un tas nav pašreizējais skripts
if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
echo "Procesu $PID ($CMD) pārtrauc, darbojas $ET"
kill $PID # Var izmantot kill -9 $PID, lai piespiedu kārtā pārtrauktu
fi
done
Šo skriptu var palaist pēc grafika, piemēram, izmantojot Crontab.
# Palaist katru minūti
* * * * * /path/to/your/long_killer.sh >> /var/log/long_killer.log 2>&1
Ir svarīgi rūpīgi noregulēt kritērijus un sliekšņus, lai izvairītos no svarīgu sistēmas procesu nejaušas pārtraukšanas.