Middle+
Какво е long killer?
sobes.tech AI
Отговор от AI
Long Killer – системен скрипт за Unix/Linux, предназначен за търсене и принудително прекратяване на процеси, които работят по-дълго от зададеното време. Обикновено се използва за управление на ресурсите и предотвратяване на замръзване на системата. Може да бъде реализиран на различни скриптови езици като Bash или Python.
Принцип на работа:
- Определяне на списък с работещи процеси (например с
ps). - Филтриране на процесите по различни критерии (потребител, име на команда и т.н.).
- Определяне на времето на работа на всеки интересуващ процес.
- Сравняване на времето на работа с предварително зададен праг.
- Изпращане на сигнал за прекратяване (например
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
Важно е внимателно да се настроят критериите и праговете, за да се избегне неволно прекратяване на важни системни процеси.