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
ps
memberi Anda daftar semua proses.
- The
grep
filter yang berdasarkan string pencarian Anda, [p]
adalah trik untuk menghentikan Anda mengambil sebenarnya grep
proses itu sendiri.
- The
awk
hanya memberi Anda bidang kedua setiap baris, yang merupakan PID.
- The
$(x)
sarana membangun untuk mengeksekusi x
kemudian mengambil output dan meletakkannya di baris perintah. Output dari ps
pipeline 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 sleep
itu, sleep 3600
dan grep sleep
(karena mereka berdua ada sleep
di dalamnya, itu bukan ilmu roket).
Namun, ps -ef | grep '[s]leep'
tidak akan membuat proses dengan sleep
itu, malah menciptakan grep '[s]leep'
dan inilah bagian yang sulit: yang grep
tidak menemukannya karena sedang mencari ekspresi reguler "setiap karakter dari kelas karakter [s]
(yang s
) diikuti oleh leep
.
Dengan kata lain, itu mencari sleep
tetapi proses grep grep '[s]leep'
yang tidak ada sleep
di 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 :-)