Sự khác biệt giữa 'killall' và 'pkill' là gì?


92

Sau khi sử dụng chỉ đơn giản kill <some_pid>trên các hệ thống Unix trong nhiều năm, tôi đã học pkilltừ một trẻ Linux am hiểu đồng nghiệp đồng nghiệp 1 .

Tôi sớm chấp nhận cách Linux, pgrep-ing và pkill-ing qua nhiều ngày và đêm, thông qua các điều kiện chậm chạp và chủng tộc. Đây là tất cả tốt và tốt.

Nhưng bây giờ tôi không thấy gì ngoài killall. How-to dường như chỉ đề cập đến killall, và tôi không chắc liệu đây có phải là một kiểu phát triển song song hay không, hay killalllà một người kế thừa pkillhay cái gì khác.

Nó dường như hoạt động như một mục tiêu nhiều hơn pkill, nhưng tôi chắc chắn rằng tôi đang thiếu một cái gì đó.

Một Ubuntu / Debian am hiểu có thể 2 người giải thích khi (hoặc tại sao) killallnên được sử dụng, đặc biệt là nếu nó nên được sử dụng trong ưu tiên cho pkill(khi pkillthường có vẻ dễ dàng hơn, bởi vì tôi có thể sloppier với tên phù hợp, ít nhất là theo mặc định).

Khi nói về điều này killall, tôi không nghĩ đến lệnh rằng trên một số hệ thống Unix (Solaris, AIX ,?) Sẽ giết chết tất cả các quy trình của người dùng. Đây là một mô tả về phiên bản đó, từ một trang dành cho AIX của IBM :

Lệnh killall hủy bỏ tất cả các quy trình mà bạn đã bắt đầu, ngoại trừ những quy trình sản xuất quy trình killall. Lệnh này cung cấp một phương tiện thuận tiện để hủy tất cả các quy trình được tạo bởi trình bao mà bạn điều khiển. Khi được bắt đầu bởi người dùng root, lệnh killall sẽ hủy tất cả các quy trình có thể hủy trừ các quy trình đã khởi động nó. Nếu một số Tín hiệu được chỉ định, chỉ có Tín hiệu cuối cùng có hiệu lực.

1 'đồng nghiệp' là bản nâng cấp miễn phí từ 'đồng nghiệp', vì vậy cũng có thể.
2 Ban đầu tôi nghĩ đây là một thứ Linux hoặc Debian, nhưng một số nguồn tin nói rằng Linux killallcó nguồn gốc từ Unix có hương vị BSD.

Câu trả lời:


68

Tôi nghĩ rằng bạn thấy killall trong cách thực hiện bởi vì theo mặc định, nó yêu cầu tên quy trình chính xác, trong khi pkill thực hiện khớp mẫu cơ bản. Do đó, killall an toàn hơn cho người dùng sao chép và dán một cách mù quáng.

Cả Wesill và killall đều có những lựa chọn khác biệt. Killall có một cờ phù hợp theo độ tuổi của quá trình, pkill có một cờ để chỉ giết các tiến trình trên một tty nhất định. Etcetera quảng cáo. Không phải là tốt hơn , họ chỉ có đặc sản khác nhau.

Tôi thấy từ các trang man của họ, killall xuất phát từ gói psmisc , có một số quy trình quản lý các tiện ích, nhưng đáng chú ý là không chứa ps. Đó là gói Procps có ps, top, kill và pkill (trong số những thứ khác). Tôi muốn cá cược ban đầu không có pkill, vì vậy psmisc gãi ngứa và nghĩ ra killall.

Các trang người đàn ông pkill / pgrep nói rằng họ đã được giới thiệu trong Solaris 7. Khi bạn đề cập đến, jgbelacqua , killall Solaris là không phải là psmisc tiện ích cung cấp, do đó Solaris lẽ chỉ có các gói procps. Ai đó muốn một công cụ xử lý khớp mẫu, do đó pkill và pgrep. Cho dù nó được phát triển bởi nhà phát triển Procps hoặc được thêm vào sau đó, tôi không biết. Bất kể, nó đã làm cho nó trở thành một phần của * nixes ở khắp mọi nơi.

Thêm nguồn:


1
Hmm - có một killallhệ thống Solaris trên (cũ?), Nhưng nó hoạt động khác đi. Nó giết tất cả.
belacqua

6
@manish - er, đã có một killall khác nhau trên các hệ thống SysV.
belacqua

1
@djeikyb Suy nghĩ về killall nghe có vẻ an toàn hơn, hoặc ít nhất điều đó có thể chiếm rất nhiều sự phổ biến của nó.
belacqua

5
@M Biến: pkill (không giết) không cần số pid, cũng không phải tên quy trình. Nó không phù hợp với tên quá trình.
Javier Rivera

3
killall is safer for users to blindly copy and paste, ngoại trừ nếu bạn đang ở trong một cỗ máy mà killall thực sự giết tất cả. Thật không may khi hai tiện ích khác nhau có cùng tên.
Lie Ryan

7

Hãy cẩn thận với "killall". Trên một số hệ thống (tôi quên cái nào), killall giết chết tất cả các quy trình. Nó sẽ âm thầm bỏ qua các đối số và làm cho hệ thống của bạn dừng lại hoàn toàn.


5
Đây không phải là sự thật. killall mà không có bất kỳ đối số sẽ không làm gì, và killall sẽ không bỏ qua các đối số. kill -9 -1có thể giết chết hệ thống của bạn, và cũng killall -9 -1có thể. Nhưng không chỉkillall [program]
Thomas Ward

6
Điều đó đúng trên các hệ thống SysV, như được đề cập trong câu hỏi ban đầu.
alanc

3

nếu bạn kích hoạt / etc / bash_completion, killall <part_of_process_name>tab sau và nhấn - tự động hoàn thành tên quy trình từ danh sách các quy trình đang chạy


2
Việc tự động hoàn thành tương tự sẽ được thực hiện với pgrep / pkill. Một cái gì đó tôi thường làm là pkill plug<tab>giết plugin flash cho firefox khi tôi biết rằng tôi không có bất cứ thứ gì tôi muốn sử dụng trong một thời gian nhưng vẫn muốn chủ động sử dụng firefox. Đây là một chức năng của shell, không phải là sự khác biệt giữa killall và pgrep / pkill.
Arcege

1
Tôi không nói là một sự khác biệt - chỉ là một tính năng hay để tránh tìm kiếm các bộ vi xử lý, tên quy trình, v.v.
máy bay phản lực

2

Nếu bạn nhìn vào các tùy chọn trên cả hai chương trình, bạn sẽ thấy rằng cả hai đều làm về cùng một thứ, nhưng theo những cách khác nhau.

pkill sẽ thực hiện khớp trên các thuộc tính khác nhau của một quy trình (CMD, PID, PPID, UID ...) và sẽ gửi tín hiệu đã cho đến từng quy trình phù hợp. (Đối với CMD, một biểu thức chính quy được sử dụng, đối với những người khác, đó là một chuỗi). pkill không tương tác, nhưng tốt hơn cho các chương trình hàng loạt.

killall sẽ thực hiện khớp trên tên tiến trình (comm) hoặc user (user), chứ không phải trên toàn bộ chuỗi lệnh. Đối số được sử dụng dưới dạng một chuỗi đơn giản và phải khớp với toàn bộ giá trị 'comm' (cũng có tùy chọn --regrec để thay đổi điều này). killall có các tùy chọn - tương tác và - younger-than, điều mà pkill không có.

Ngoài ra còn có killall5 là từ những ngày SysV và được chuyển sang các biến thể UNIX khác (được cho là theo gói 'sysutils' của gói Ubuntu). Điều này hành xử khác nhau trong cách thức thời trang cũ. Điều này thường được sử dụng nội bộ cho các tập lệnh init để tắt hoặc thay đổi sang chế độ người dùng đơn.


2
Không, pkillcũng không killallnên được sử dụng trong các tập lệnh, chỉ tương tác và thận trọng.
geirha
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.