В bash, вы должны быть в состоянии сделать:
kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')
Подробности его работы следующие:
- Это
psдает вам список всех процессов.
- В
grepфильтры , которые основаны на поисковой строке, [p]это трюк , чтобы остановить вас собирание фактического grepсамого процесса.
- Право
awkпросто дает вам второе поле каждой строки, которое является PID.
- В
$(x)средстве конструкта выполнить xзатем принять свой вывод и положить его в командной строке. Вывод этого psконвейера внутри вышеупомянутой конструкции представляет собой список идентификаторов процессов, поэтому вы получите команду вроде kill 1234 1122 7654.
Вот расшифровка, показывающая это в действии:
pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+ Terminated sleep 3600
[1] Terminated sleep 3600
[2] Terminated sleep 3600
[3]- Terminated sleep 3600
[4]+ Terminated sleep 3600
и вы можете видеть, что это прекращает все шпалы.
Объясняя grep '[p]ython csp_build.py'немного более подробно:
Когда вы выполняете sleep 3600 &последующее ps -ef | grep sleep, вы, как правило, получаете два процесса с sleepним, sleep 3600и и grep sleep(потому что они оба имеют sleepв них, это не ракетостроение).
Однако, ps -ef | grep '[s]leep'не будет создавать процесс с sleepним, он вместо этого создаст grep '[s]leep'и вот хитрый момент: grepон не находит его, потому что ищет регулярное выражение «любой символ из класса символов [s](который s), за которым следует» leep.
Другими словами, он ищет, sleepно процесс grep - это то, grep '[s]leep'чего нет sleepв нем.
Когда мне показали это (кто-то здесь на SO), я сразу начал использовать его, потому что
- это на один процесс меньше, чем добавление
| grep -v grep; а также
- это элегантно и подлый, редкое сочетание :-)