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