Cách đưa ra các đối số để tiêu diệt qua đường ống


85

Tôi cần tìm kiếm một quá trình nhất định và giết quá trình đó. Tôi đã viết một lệnh như sau:

ps -e | grep dmn | awk '{print $1}' | kill

Tên quy trình ở đâu dmn. Nhưng nó không hoạt động. Làm cách nào để tìm các quy trình theo tên và killchúng.

Câu trả lời:


162
kill $(ps -e | grep dmn | awk '{print $1}')

8
Sử dụng các phiên bản mới hơn $()cú pháp: kill $(ps -e | grep dmn | awk '{print $1}').
Stratus3D

7
fwiw cho những người khác, tôi đã phải sửa đổi câu trả lời này để làm cho nó hoạt động: kill $(ps -efw | grep dmn | grep -v grep | awk '{print $2}')không chắc chắn tại sao và không quan tâm quá nhiều để tìm hiểu sâu hơn về nó.
joshweir

1
@joshweir Đó là bởi vì nếu không thì killđã cố gắng giết ngay cả quá trình 'grep' đang cố gắng tìm kiếm mô hình đó
ít nhất

Nó sẽ không được yêu cầu \nsau mỗi awk, như trong awk '{print $1"\n"}'?
Sopalajo de Arrierez

43

Trong trường hợp có nhiều quy trình mà bạn muốn xóa, bạn có thể sử dụng điều này:

ps -efw | grep dmn | grep -v grep | awk '{print $2}' | xargs kill

Lưu ý: Bạn cần xóa chính quá trình grep khỏi đầu ra, đó là lý do tại sao grep -v grepđược sử dụng.


17
Bạn có thể tránh grep hiển thị trong grep của bạn bằng cách đặt char đầu tiên bên trong dấu ngoặc, như: grep [d] mn
Oldskool

1
@Oldskool Bí quyết hay. Sử dụng metacharacteres để làm cho biểu thức chính quy grep không khớp với chính nó là một ý tưởng hay.
jcollado

@Oldskool, +1, bạn là một thiên tài!
jcr

Đẹp lừa, mặc dù nó không làm cho nó thêm phức tạp để biến thành một kịch bản shell
Metagrapher

17

Bạn đã có thể sử dụng

pkill dmn 

nếu hệ thống của bạn có lệnh pkill .


1
+1 cho pkill thay vì killall. Nó có sẵn trên nhiều nền tảng mà không có "ý nghĩa" khác nhau ( ví dụ: killall trên Solaris tương đương với killall5 trên Linux - Nghĩa là giết TẤT CẢ các quy trình)
plundra

4

Chỉ thêm vào những người khác, nhưng tôi thích sử dụng dung lượng các tính năng regex của awk:

kill $(ps | awk '/dmn/{print $1}')

4

Nếu bạn có pidoflệnh trên hệ thống của mình (tôi biết các shell chẳng hạn như ZSH đi kèm với điều này theo mặc định, trừ khi tôi nhầm lẫn), bạn có thể làm điều gì đó như.

kill -9 $(pidof dmn)


2

Bạn có thể không cần pipeđiều này, nếu bạn có pidoflệnh và biết tên hình ảnh, tôi đã làm như thế này:

kill $(pidof synergyc)

$()Tôi hiểu điều này vì nó chuyển đổi đầu ra đó thành một biến mà kill có thể sử dụng, về cơ bản giống như pipe sẽ làm. Ngắn hơn và dễ hiểu hơn một số tùy chọn khác nhưng cũng có thể kém linh hoạt và trực tiếp hơn.


0
for procid in $(ps -aux | grep "some search" | awk '{print $2}'); do kill -9 $procid; done

xin chào bạn bè .. chúng ta có thể làm điều đó bằng cách sử dụng vòng lặp for.

"Một số tìm kiếm" ở đây là bất kỳ tên quy trình nào bạn muốn tìm kiếm, ví dụ "java", vì vậy giả sử số lượng quy trình java là hơn 200 vì vậy việc giết từng cái một sẽ là quá điển hình.

vì vậy bạn có thể sử dụng lệnh trên.

Cảm ơn.


0

Sử dụng pgrepvới tùy chọn -f. kill $(pgrep -f dmn)


4
Nếu bạn có pgrep, tại sao không chỉ pkill -f dmn?
muru
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.