Điểm:0

Làm cách nào để tiêu diệt 3 quy trình có tên hoàn toàn khác nhau?

lá cờ in

Tôi muốn giết 3 quy trình với tất cả các tên khác nhau, không có điểm chung nào cả. Làm thế nào để tôi làm điều này? grep không thể nắm bắt tất cả vì không có điểm chung nào hoặc có cách nào để bắt tất cả chúng không?

Nmath avatar
lá cờ ng
Thật khó để trả lời một câu hỏi mà không có bất kỳ chi tiết nào. Để bắt đầu, bạn có thể cho chúng tôi biết các quy trình và lý do tại sao bạn không thể chỉ chạy ba lệnh.
guiverc avatar
lá cờ cn
Kill cho phép bạn chỉ định nhiều PID; xem `man kill` để biết trang hướng dẫn tham khảo.
Quasímodo avatar
lá cờ jp
-1 Tôi thực sự không hiểu điều này. Ngay cả khi mọi lệnh có thể giết chỉ có thể giết một tiến trình duy nhất, tất cả những gì bạn phải làm là ra lệnh ba lần, phải không?
Điểm:8
lá cờ fr

Một ví dụ cho việc giết đĩa gnomemàn hình hệ thống gnome.

giết $(pidof gnome-disks gnome-system-monitor)

Tôi chắc chắn rằng chúng tôi đã có thứ này ở quanh đây dưới một hình thức nào đó, bởi vì ai đó ở đây chắc hẳn đã nói với tôi điều gì đó giống như thế này nhiều năm trước.

Bạn có thể làm cho nó đẹp hơn, nhưng phức tạp hơn như thế này:

# Cung cấp một danh sách các tên chương trình bị hủy được phân tách bằng khoảng trắng
program_to_kill="gnome-disks gnome-system-monitor"
giết $(pidof $programs_to_kill)
melvio avatar
lá cờ cn
Được ủng hộ. @dawnslayer Tôi đề nghị bạn đánh dấu đây là câu trả lời được chấp nhận. Giải pháp này sẽ là cách tiếp cận tốt nhất cho hầu hết mọi người.
Điểm:4
lá cờ cn

Nếu bạn thực sự muốn sử dụng mò mẫm, bạn có thể dùng pkill để lấy id tiến trình (pids). pkill chúc mừng đối với một số mẫu trong tên quy trình và giết các quy trình được tìm thấy.

Cú pháp bạn có thể sử dụng là:

pkill ' process_name1|other_ process|something_else'

Bạn có thể dùng pgrep (xử lý grep) để kiểm tra những gì bạn sắp giết bằng pkill.
Cú pháp rất giống nhau:

pgrep -l 'proces_name1|other_process|something_else'

Ví dụ: nếu tôi chạy lệnh sau trên máy của mình, tôi sẽ nhận được danh sách các kết quả khớp với chúng pidS:

$ pgrep -l 'clamd|dockerd|snapd'
chụp nhanh năm 1952
1989 ngao
docker 2085
2813 docker

Cảnh báo: Nếu bạn thực sự biết tên quy trình đầy đủ, vui lòng sử dụng LiveWireBTcâu trả lời của:

giết $(pidof process_name1 other_proces)

theo cách đó, đại lý sshsshd sẽ không phải là nạn nhân khi bạn chạy pkill ssh và không chú ý đến những gì pgrep -l ssh nói.

melvio avatar
lá cờ cn
Lưu ý rằng cá nhân tôi sẽ sử dụng câu trả lời @LiveWireBT. Grepping có thể phức tạp và cuối cùng bạn có thể giết quá ít tiến trình, hoặc thậm chí tệ hơn là quá nhiều. Tuy nhiên, vì bạn đã đề cập đến grep, tôi đã thêm câu trả lời này để cung cấp cho bạn chức năng.
Peter Cordes avatar
lá cờ fr
Bạn có thể neo các mẫu bằng `^foo$|^bar$` hoặc thứ gì đó để buộc chúng khớp với tên quy trình đầy đủ, thay vì chỉ các chuỗi con có thể dễ dàng khớp quá nhiều không? Hoặc tùy chọn pkill/pgrep để yêu cầu khớp chuỗi đầy đủ như `grep -x`?
melvio avatar
lá cờ cn
Nhận xét @PeterCordes hiển thị chính xác vấn đề với grep; sẽ rủi ro hơn mức cần thiết nếu bạn đã biết tên đầy đủ. Nếu bạn biết tên đầy đủ của quy trình cần hủy, tôi thậm chí sẽ không bận tâm đến `-x` hoặc `^tên quy trình$`. Thay vào đó, tôi sẽ sử dụng giải pháp của @LiveWireBT. Chỉ sử dụng điều này nếu bạn muốn kết hợp chức năng `grep`+`kill`.
Peter Cordes avatar
lá cờ fr
Chắc chắn rồi, nhưng nếu bạn muốn đăng bài về grep, bạn có thể nói cụ thể về những rủi ro là gì và điều gì khiến việc sử dụng nó trở nên kém thuận tiện hơn một cách an toàn.
melvio avatar
lá cờ cn
Tôi đồng ý @PeterCordes. Tôi đã thêm ghi chú **cảnh báo**. Tôi cũng sẵn lòng chấp nhận các chỉnh sửa bổ sung giải thích sự đánh đổi/rủi ro/cảnh báo.
Điểm:2
lá cờ my
giết tất cả tên1 && giết tất cả tên2 && giết tất cả tên3
LiveWireBT avatar
lá cờ fr
Giai thoại: Trong một vài năm trước, chúng tôi phải theo dõi các ứng dụng java và khởi động lại chúng nếu cần. Vì vậy, tôi đã sử dụng `killall` để hủy các tiến trình, điều đó không sao cả. Tôi đã khởi động lại chúng như trong tài liệu mà chúng tôi có. Tất cả đều ổn. Cho đến ngày hôm sau (hoặc vài ngày nữa) khi bộ phận hỗ trợ cấp hai hỏi tôi đã tắt các quy trình như thế nào, vì ứng dụng java được cho là giám sát các quy trình đã "chết" và không quay lại. Tuy nhiên, ứng dụng đó không có trong tài liệu của chúng tôi. Những điều ngớ ngẩn mọi người làm. :-) (Hiểu kém về nền tảng ứng dụng, tài liệu kém.)
LiveWireBT avatar
lá cờ fr
Xin chào cộng tác viên mới. Vui lòng cung cấp một câu trả lời đầy đủ. Có thể bạn quan tâm tại sao bạn chọn hủy bỏ nếu lệnh hủy đầu tiên không thành công, đó là điều mà việc xâu chuỗi các lệnh cùng với `&&` thực hiện trong bash.
bac0n avatar
lá cờ cn
`killall name1 name2 name3` sẽ làm được.
Điểm:-1
lá cờ us

Giả sử bạn có thể chọn ba quy trình theo tên, thì giải pháp của tôi sẽ là:

giết `ps awx| grep -E '((ProcessNameA)|(ProcessNameB)|(ProcessNameC))' |grep -v grep| sed "s/ .*$//"`
LiveWireBT avatar
lá cờ fr
A well known hack to avoid `grep 'pattern' | grep -v grep` is to use `grep '[p]attern'`. :-)
LiveWireBT avatar
lá cờ fr
It probably gets the job done, but you should study more manpages of the tools available. I built similar things years ago which coworkers were afraid to touch. I know when I mangle too much through grep and sed, then I should take a look at awk or rethink the whole thing. shellcheck is a useful tool. Googles Shell Style Guide is also worth a read.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.