Sobes.tech
Middle+

Ի՞նչ է long killer-ը։

sobes.tech AI

Պատասխան AI-ից

Long Killer – օգտագործողի սցրիպտ Unix/Linux համակարգում, որը նախատեսված է երկար ժամանակ աշխատող պրոցեսների որոնման և հարկադիր ավարտման համար: Հաճախ օգտագործվում է ռեսուրսների կառավարման և համակարգի կախվածության կանխարգելման համար: Կարող է իրականացվել տարբեր սցրիպտային լեզուներով, ինչպիսիք են Bash կամ Python:

Աշխատանքի սկզբունքը՝

  1. Սկսած պրոցեսների ցանկի որոշում (օրինակ, ps-ի միջոցով):
  2. Պրոցեսների ֆիլտրում տարբեր չափանիշներով (օգտագործող, հրամանի անուն և այլն):
  3. Յուրաքանչյուր հետաքրքրող պրոցեսի աշխատանքի տևողության որոշում:
  4. Տևողության համեմատում նախապես սահմանված շեմի հետ:
  5. Հաղորդագրության ուղարկում պրոցեսներին, որոնք գերազանցել են շեմը (SIGTERM կամ SIGKILL):

Bash-ում իրականացնելու օրինակ՝

#!/bin/bash

# Շեմը՝ վայրկյաններով
THRESHOLD_SECONDS=3600 # 1 ժամ

# Փնտրվող պրոցեսի անունը։ Թողեք դատարկ՝ '', եթե ուզում եք փնտրել բոլոր պրոցեսները
PROCESS_NAME=""

# Օգտագործողը, որի անունով են սկսվել պրոցեսները։ Թողեք դատարկ՝ '', եթե ուզում եք փնտրել բոլոր օգտագործողներին
USER=""

# Ապացույց պրոցեսների անունները (առանց քառակուսիների)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"

# Պրոցեսների ցանկը, աշխատանքի ժամանակը (ET), PID, հրամանի անունը և օգտագործողը
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
    # Աշխատանքի ժամանակը վայրկյաններով
    SECS=0
    if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Օր-ժամ:րոպե:վայրկյան
        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 # Ժամ:րոպե:վայրկյան
        SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
    elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Մինիտ:վայրկյան
        SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
    elif [[ "$ET" =~ ([0-9]+) ]]; then # Վայրկյան
        SECS=${BASH_REMATCH[1]}
    fi

    # Շերտերի ստուգում՝ ավարտելու համար
    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

    # Ապացույցների ցանկի ստուգում
    for EXCLUDE in $EXCLUDE_PROCESSES; do
        if [[ "$CMD" == *"$EXCLUDE"* ]]; then
            KILL=false
            break
        fi
    done

    # Պրոցեսի ավարտում, եթե բոլոր պայմանները կատարվեն և դա չլինի այս սցրիպտը
    if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
        echo "Պրոցես $PID ($CMD) ավարտվում է, աշխատել է $ET"
        kill $PID # Կարող եք օգտագործել kill -9 $PID ուժեղ ավարտի համար
    fi
done

Այս սցրիպտը կարող եք գործարկել պլանավորել, օրինակ, Crontab-ի միջոցով:

# Յուրաքանչյուր րոպե
* * * * * /path/to/your/long_killer.sh >> /var/log/long_killer.log 2>&1

Կարևոր է մանրակրկիտ կարգավորել չափանիշներն ու շեմերը՝ կանխելու համար կարևոր համակարգային պրոցեսների անզգուշական ավարտը։