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

მნიშვნელოვანია კრიტერიუმებისა და ზღვართა ზუსტად დაყენება, რათა თავიდან აიცილოთ მნიშვნელოვანი სისტემური პროცესების შემთხვევითი დასრულება.