Уничтожить неотвечающий процесс по имени, но сохранить отвечающие процессы

Уничтожить неотвечающий процесс по имени, но сохранить отвечающие процессы

По какой-то причине у меня в итоге оказывается несколько процессов Google Chrome Helper, которые перестают отвечать, пожирая ресурсы процессора. Обычно я просто запускаю killall Google\ Chrome\ Helper, однако это убивает все, включая отвечающие процессы, что означает, что мне приходится перезапускать Chrome.

Есть ли флаг, который killallвлияет только на неотвечающие процессы?

решение1

Один из способов сделать это — использовать toppid процесса, использующего больше всего CPU. Я запустил bash CPU hog в одном терминале:

bash -c "while true; do :; done"

Затем в другом терминале я могу убить его следующим образом:

kill $( top -l2 | grep bash | sort -nrk3 | awk '{print $1;exit}' )

Обратите внимание, поскольку это, это topверсия BSD, а не GNU.

  • -l2сообщает top о необходимости выполнения 2 итераций — первую нужно игнорировать, поскольку она просто сообщает о 0% загрузки ЦП для всех процессов.
  • Фильтрует grepтолько строки bash. Обратите внимание, что это может потребовать больше работы, если ваше выражение grep совпадает с любыми другими частями вывода top.
  • sortсортирует вывод в обратном порядке по третьему столбцу (% ЦП)
  • headполучает первую строку (самый высокий ЦП)
  • cutполучает первый столбец (PID)
  • Вышеприведенное выполняется в $()подстановке команды, а числовой PID просто передается напрямуюkill

На машинах GNU/Linux эквивалент выглядит так:

kill $(top -bn1 | grep bash | sort -nrk9 | awk '{print $1;exit}')

Связанный контент