Я запускаю сценарий "delayed_job" для приложения Ruby on Rails. Один из вариантов - запустить эту процедуру с отдельной процедурой монитора. Когда главный процесс умирает, монитор порождает новый. Я также могу запускать несколько процессов. У каждого будет свой связанный процесс мониторинга.
Сценарий позволяет убить основные процессы, но не процессы мониторинга. Я хочу убить их всех.
Команда:
ps -ef|grep delayed
дает:
42011 29423 1 0 Sep25 ? 00:00:02 delayed_job.0_monitor
42011 29428 1 0 Sep25 ? 00:00:02 delayed_job.1_monitor
42011 29434 1 0 Sep25 ? 00:00:02 delayed_job.2_monitor
42011 29437 1 0 Sep25 ? 00:00:01 delayed_job.3_monitor
42011 23359 1 10 Oct19 ? 03:12:49 delayed_job.0
42011 8607 1 5 Oct19 ? 00:58:42 delayed_job.3
42011 21442 1 44 12:31 ? 01:02:03 delayed_job.2
42011 23092 1 4 14:18 ? 00:01:22 delayed_job.1
42011 23861 23763 0 14:51 pts/5 00:00:00 grep delayed
Я хочу убить их всех, или хотя бы мониторов. Как я могу их убить (за исключением самой команды grep)?
http://www.tech-recipes.com/rx/742/kill-the-undesired-unix-processes-in-one-go/ есть хорошая запись обычного ответа для универсального unix: направьте ps в grep, затем в awk, затем в xargs.
Как упоминалось на другом плакате, остерегайтесь любого бойкого ответа, который бросает «killall», поскольку он имеет совершенно иное назначение в AIX и Solaris (по крайней мере), чем в Linux. Запуск killall от имени root в Solaris - это «событие, генерирующее возобновление».
Помимо приведенных выше ответов pkill и killall, вы можете сделать следующее, предполагая, что вы хотите убить процесс "foo"
ps -ef | grep [f]oo | awk {'print $1'} | xargs kill
В grep [f]oo
означает, что grep не будет соответствовать самой команде grep, поэтому он просто уничтожит процессы с именем «foo».
Если вы работаете на компьютере с Linux, команда killall кажется именно тем, что вам нужно.
pkill
и killall
варианты этого.
# pkill vim
# killall vim
Оба имеют расширенную документацию на соответствующих страницах руководства.