В 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
; і
- це елегантний і підлий, рідкісне поєднання :-)