Ниже — несколько безопасных и удобных способов завершить несколько процессов по их PID. Предположим, что вы уже умеете получать PID процессов с CPU > 80%, например так:
ps -eo pid,pcpu --no-headers | awk '$2>80{print $1}'
1) Самый простой (одним вызовом kill)
pids=$(ps -eo pid,pcpu --no-headers | awk '$2>80{print $1}')
[ -n "$pids" ] && sudo kill $pids
Комментарий: сначала отправляется SIGTERM (по умолчанию). Без sudo если у вас хватает прав. Команда ничего не сделает, если переменная пустая.
2) Через xargs (если хотите сразу отправить SIGKILL)
ps -eo pid,pcpu --no-headers | awk '$2>80{print $1}' | xargs -r sudo kill -9
Примечание: xargs -r (или --no-run-if-empty) предотвращает выполнение kill, если списка нет. На macOS вместо -r может понадобиться --no-run-if-empty (в BSD xargs есть --no-run-if-empty).
3) Безопасный двухэтапный подход (сначала SIGTERM, если не умирают — SIGKILL)
pids=$(ps -eo pid,pcpu --no-headers | awk '$2>80{print $1}')
if [ -n "$pids" ]; then
echo "Будут посланы SIGTERM для PID: $pids"
sudo kill $pids
sleep 5
# проверим, какие ещё живы
for pid in $pids; do
if kill -0 $pid 2>/dev/null; then
echo "PID $pid не завершился, посылаем SIGKILL"
sudo kill -9 $pid
fi
done
fi
4) По одному PID (цикл)
ps -eo pid,pcpu --no-headers | awk '$2>80{print $1}' | while read pid; do
echo "Killing $pid"
sudo kill $pid
done
Важные замечания
- Старайтесь сначала отправлять SIGTERM (kill), а не сразу SIGKILL (-9). SIGKILL не даёт процессу шанс корректно освободить ресурсы или сохранить данные.
- Проверяйте список PID перед убийством, чтобы не завершить системные процессы или процессы root по ошибке.
- Для выполнения kill на чужих процессах может потребоваться sudo/root.
- На некоторых системах ps/awk вывод могут отличаться — корректируйте команды под свою систему.
Если хотите, могу предложить готовую команду с выводом списка перед завершением или помочь настроить порог/фильтрацию по имени процесса.