В 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
; а также
- это элегантно и подлый, редкое сочетание :-)