Иногда процессы зависают - висят в D (disk sleep) или Z (zombie), потребляют CPU без пользы, или держат файлы, которые нужно удалить. Просто killall - грубо и может снести лишнее. Давайте сделаем это умнее.
▪️ Задача:
Найти и безопасно завершить только зависшие или чрезмерно "прожорливые" процессы, избегая случайных убийств важных задач.
▪️ Подход:
Сканируем ps на предмет "подозрительных" состояний.
Проверяем длительность жизни процесса.
Ограничиваем по имени, CPU или статусу.
Включаем dry-run перед действием.
▪️ Пример скрипта:
#!/usr/bin/env bash
set -euo pipefail
PATTERN="python" # Имя процесса (или часть имени)
MAX_CPU=80 # Максимально допустимая загрузка CPU
MAX_AGE=3600 # В секундах: 1 час
DRY_RUN=true # Безопасный режим
echo "Поиск процессов по шаблону: $PATTERN"
ps -eo pid,etime,pcpu,comm --sort=-pcpu | awk -v pattern="$PATTERN" -v max_cpu="$MAX_CPU" -v max_age="$MAX_AGE" -v dry_run="$DRY_RUN" '
function hms_to_sec(s, t, n, h, m) {
gsub("-", "", s)
n = split(s, t, /[:-]/)
if (n == 3) { h = t[1]; m = t[2]; s = t[3] }
else if (n == 2) { h = 0; m = t[1]; s = t[2] }
else { h = 0; m = 0; s = t[1] }
return h * 3600 + m * 60 + s
}
NR>1 && $4 ~ pattern {
age = hms_to_sec($2)
cpu = $3
if (cpu > max_cpu || age > max_age) {
printf "[!] Найден подозрительный процесс: PID=%s CPU=%.1f%% AGE=%ss CMD=%s\n", $1, cpu, age, $4
if (dry_run == "false") {
system("kill -9 " $1)
print "[x] Завершен PID=" $1
} else {
print "[i] Dry run: процесс НЕ завершен"
}
}
}
▪️ Что умеет:
Выборочно завершает процессы с перегрузкой по CPU
Проверяет "возраст" процессов по etime
Работает в dry-run режиме по умолчанию
Прост в кастомизации: ищи по имени, статусу, времени
BashTex 📱 #bash