Sobes.tech
Middle+

Long killer nima?

sobes.tech AI

AIdan javob

Long Killer Unix/Linux tizimlarida ishlatiladigan, belgilangan vaqtdan ortiq ishlayotgan jarayonlarni topish va majburan to'xtatish uchun mo'ljallangan foydalanuvchi skriptidir. Odatda resurslarni boshqarish va tizimning to'xtashini oldini olish uchun ishlatiladi. Bash yoki Python kabi turli skript tillarida amalga oshirilishi mumkin.

Ishlash prinsipi:

  1. Ishga tushirilgan jarayonlar ro'yxatini aniqlash (masalan, ps yordamida).
  2. Jarayonlarni turli mezonlarga (foydalanuvchi, buyruq nomi va boshqalar) ko'ra filtrlash.
  3. Har bir qiziqarli jarayonning ishlash muddatini aniqlash.
  4. Ushbu muddatni oldindan belgilangan chegaraviy qiymat bilan solishtirish.
  5. Chegarani oshgan jarayonlarga signal yuborish (masalan, SIGTERM yoki SIGKILL).

Bashda misol:

#!/bin/bash

# Chegara vaqti sekundlarda
THRESHOLD_SECONDS=3600 # 1 soat

# Qidirilayotgan jarayon nomi. Bo'sh qoldiring '', agar barcha foydalanuvchi jarayonlarini qidirmoqchi bo'lsangiz
PROCESS_NAME=""

# Jarayonlarni ishga tushirgan foydalanuvchi. Bo'sh qoldiring '', agar barcha foydalanuvchilarning jarayonlarini qidirmoqchi bo'lsangiz
USER=""

# Noma'lum jarayonlarni chiqarib tashlash (bo'sh joy bilan ajratilgan)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"

# Jarayonlar ro'yxatini, ularning ishlash vaqtini (ET), PID, buyruq nomi va foydalanuvchi
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
    # Ishlash vaqtini sekundlarga o'tkazish
    SECS=0
    if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Kun-soat:minut:sekund
        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 # Soat:minut:sekund
        SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
    elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Minut:sekund
        SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
    elif [[ "$ET" =~ ([0-9]+) ]]; then # Sekund
        SECS=${BASH_REMATCH[1]}
    fi

    # To'xtatish shartlarini tekshirish
    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

    # Noma'lum jarayonlar ro'yxatini tekshirish
    for EXCLUDE in $EXCLUDE_PROCESSES; do
        if [[ "$CMD" == *"$EXCLUDE"* ]]; then
            KILL=false
            break
        fi
    done

    # Jarayonni, agar barcha shartlar bajarilgan bo'lsa va bu skript emas bo'lsa, to'xtatish
    if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
        echo "Jarayon $PID ($CMD) $ET davom etmoqda"
        kill $PID # Majburan to'xtatish uchun kill -9 $PID ishlatilishi mumkin
    fi
done

Ushbu skriptni muntazam ravishda ishga tushirish uchun, masalan, Crontab yordamida rejalashtirish mumkin.

# Har minutda ishga tushirish
* * * * * /path/to/your/long_killer.sh >> /var/log/long_killer.log 2>&1

Muhim: mezonlar va chegaralarni ehtiyotkorlik bilan sozlash, muhim tizim jarayonlarini noto'g'ri to'xtatishni oldini olish uchun zarur.