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

Важно е внимателно да се настроят критериите и праговете, за да се избегне неволно прекратяване на важни системни процеси.