Sobes.tech
Middle+

Long killer nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Long Killer Unix/Linux sistemlərində istifadə olunan, müəyyən edilmiş vaxtdan çox işləyən prosesləri tapıb zorla dayandırmaq üçün hazırlanmış istifadəçi skriptidir. Ümumiyyətlə, resursların idarə olunması və sistemin donmasının qarşısını almaq üçün istifadə olunur. Bu, Bash və ya Python kimi müxtəlif skript dillərində həyata keçirilə bilər.

İş prinsipi:

  1. İşə salınmış proseslərin siyahısının müəyyən edilməsi (məsələn, ps vasitəsilə).
  2. Müxtəlif meyarlara görə proseslərin filtrlənməsi (istifadəçi, komanda adı və s.).
  3. Hər bir maraqlı prosesin işləmə müddətinin müəyyən edilməsi.
  4. Bu müddətin əvvəlcədən təyin olunmuş sərhəd dəyəri ilə müqayisəsi.
  5. Bu sərhədi aşan proseslərə sonlandırma siqnalı göndərilməsi (məsələn, SIGTERM və ya SIGKILL).

Bashda nümunə:

#!/bin/bash

# Sərhəd vaxtı saniyə ilə
THRESHOLD_SECONDS=3600 # 1 saat

# Axtarış üçün proses adı. Boş buraxın '', əgər bütün istifadəçi proseslərini axtarmaq istəyirsinizsə
PROCESS_NAME=""

# Prosesləri işlədən istifadəçi. Boş buraxın '', əgər bütün istifadəçilərin proseslərini axtarmaq istəyirsinizsə
USER=""

# İstisna prosesləri ad ilə xaric et (boşluqla ayrılmış)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"

# Proseslərin siyahısını, işləmə vaxtını (ET), PID, komanda adı və istifadəçi adını alın
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
    # İşləmə vaxtını saniyəyə çevir
    SECS=0
    if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Gün- saat: dəqiqə: saniyə
        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 # Saat: dəqiqə: saniyə
        SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
    elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Dəqiqə: saniyə
        SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
    elif [[ "$ET" =~ ([0-9]+) ]]; then # Saniyə
        SECS=${BASH_REMATCH[1]}
    fi

    # Sonlandırma şərtlərini yoxlayın
    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

    # İstisna siyahısını yoxlayın
    for EXCLUDE in $EXCLUDE_PROCESSES; do
        if [[ "$CMD" == *"$EXCLUDE"* ]]; then
            KILL=false
            break
        fi
    done

    # Bütün şərtlər ödənərsə və bu skript deyilsə, prosesi dayandırın
    if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
        echo "$ET müddətində işləyən $PID ($CMD) prosesini dayandırmaq"
        kill $PID # Zorla dayandırmaq üçün kill -9 $PID istifadə edilə bilər
    fi
done

Bu skript periodik olaraq, məsələn, Crontab vasitəsilə işlədilə bilər.

# Hər dəqiqə işlət
* * * * * /path/to/your/long_killer.sh >> /var/log/long_killer.log 2>&1

Əhəmiyyətli: meyarlar və sərhədlər diqqətlə tənzimlənməlidir ki, vacib sistem proseslərinin təsadüfən dayandırılmasının qarşısı alınsın.