Trong bash, bạn sẽ có thể làm:
kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')
Chi tiết về hoạt động của nó như sau:
- Cung
pscấp cho bạn danh sách của tất cả các quy trình.
- Các
grepbộ lọc dựa trên chuỗi tìm kiếm của bạn, [p]là một mẹo để ngăn bạn tự chọn grepquy trình thực tế .
- Trường
awkchỉ cung cấp cho bạn trường thứ hai của mỗi dòng, đó là PID.
- Cấu
$(x)trúc có nghĩa là thực thi xsau đó lấy đầu ra của nó và đặt nó trên dòng lệnh. Đầu ra của psđường ống bên trong cấu trúc bên trên là danh sách ID tiến trình để bạn kết thúc bằng một lệnh như thế nào kill 1234 1122 7654.
Đây là bảng điểm cho thấy nó hoạt động:
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
và bạn có thể thấy nó chấm dứt tất cả những người ngủ.
Giải thích grep '[p]ython csp_build.py'bit chi tiết hơn một chút:
Khi bạn làm sleep 3600 &theo ps -ef | grep sleep, bạn có xu hướng nhận được hai quy trình sleeptrong đó, sleep 3600và grep sleep(vì cả hai đều có sleeptrong đó, đó không phải là khoa học tên lửa).
Tuy nhiên, ps -ef | grep '[s]leep'sẽ không tạo ra một quy trình với sleepnó, thay vào đó nó tạo ra grep '[s]leep'và đây là một mẹo nhỏ: grepkhông tìm thấy vì nó tìm biểu thức chính quy "bất kỳ ký tự nào từ lớp nhân vật [s](được s) theo sau leep.
Nói cách khác, nó đang tìm kiếm sleepnhưng quá trình grep grep '[s]leep'không có sleeptrong đó.
Khi tôi được hiển thị cái này (bởi ai đó ở đây trên SO), tôi ngay lập tức bắt đầu sử dụng nó bởi vì
- đó là một quá trình ít hơn so với việc thêm vào
| grep -v grep; và
- nó thanh lịch và lén lút, một sự kết hợp hiếm có :-)