Di bash, Anda harus dapat melakukan:
kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')
Rincian tentang cara kerjanya adalah sebagai berikut:
- The
psmemberi Anda daftar semua proses.
- The
grepfilter yang berdasarkan string pencarian Anda, [p]adalah trik untuk menghentikan Anda mengambil sebenarnya grepproses itu sendiri.
- The
awkhanya memberi Anda bidang kedua setiap baris, yang merupakan PID.
- The
$(x)sarana membangun untuk mengeksekusi xkemudian mengambil output dan meletakkannya di baris perintah. Output dari pspipeline di dalam yang membangun di atas adalah daftar ID proses sehingga Anda berakhir dengan perintah seperti kill 1234 1122 7654.
Berikut transkrip yang menunjukkannya dalam aksi:
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
dan Anda bisa melihatnya mengakhiri semua tidur.
Menjelaskan grep '[p]ython csp_build.py'sedikit lebih detail:
Ketika Anda sleep 3600 &mengikuti ps -ef | grep sleep, Anda cenderung mendapatkan dua proses dengan sleepitu, sleep 3600dan grep sleep(karena mereka berdua ada sleepdi dalamnya, itu bukan ilmu roket).
Namun, ps -ef | grep '[s]leep'tidak akan membuat proses dengan sleepitu, malah menciptakan grep '[s]leep'dan inilah bagian yang sulit: yang greptidak menemukannya karena sedang mencari ekspresi reguler "setiap karakter dari kelas karakter [s](yang s) diikuti oleh leep.
Dengan kata lain, itu mencari sleeptetapi proses grep grep '[s]leep'yang tidak ada sleepdi dalamnya.
Ketika saya ditunjukkan ini (oleh seseorang di sini di SO), saya langsung mulai menggunakannya karena
- itu satu proses kurang dari menambahkan
| grep -v grep; dan
- elegan dan licik, kombinasi langka :-)