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
ps
cấp cho bạn danh sách của tất cả các quy trình.
- Các
grep
bộ 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 grep
quy trình thực tế .
- Trường
awk
chỉ 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 x
sau đó 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 sleep
trong đó, sleep 3600
và grep sleep
(vì cả hai đều có sleep
trong đó, đó 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 sleep
nó, thay vào đó nó tạo ra grep '[s]leep'
và đây là một mẹo nhỏ: grep
khô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 sleep
nhưng quá trình grep grep '[s]leep'
không có sleep
trong đó.
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ó :-)