Sobes.tech
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:

  1. Aktīvo procesu saraksta noteikšana (piemēram, ar ps).
  2. Procesu filtrēšana pēc dažādiem kritērijiem (lietotājs, komandas nosaukums utt.).
  3. Katras interesējošās procesa darba ilguma noteikšana.
  4. Darba ilguma salīdzināšana ar iepriekš noteiktu slieksni.
  5. Signāla sūtīšana procesa pārtraukšanai (piemēram, SIGTERM vai SIGKILL), 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.