Назад | Перейти на главную страницу

Есть ли команда типа Unix для уничтожения всех процессов с определенным именем?

Я запускаю сценарий "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

Оба имеют расширенную документацию на соответствующих страницах руководства.