Kill 0 thực sự làm gì?


10

Trong man pageđó, nó nói:

          0      All processes in the current process group are signaled

Và tôi đã thử như thế này:

$ man kill &
[1] 15247
$
[1]+  Stopped                 man kill
$ kill 0
$ ps
15247 pts/41   00:00:00 man

Theo tôi hiểu, kill 0sẽ giết tất cả các quy trình trong quy trình hiện tại, bao gồm pid15247. Tuy nhiên, nó không làm gì trong ví dụ này. Có ai có ý tưởng về cách sử dụng nó?


Bạn đang sử dụng vỏ gì?
FatalError

@FirthError Tôi đang sử dụng Bash
Firegun

Câu trả lời:


4

Tôi không thể tìm thấy một ghi chú về cách kill 0cư xử trong trang giết người của tôi (debian).

Nhưng tôi có hai ý kiến:

(1) "Nhóm quy trình" có thể không như bạn mong đợi. Bạn có thể hiển thị ID nhóm quy trình (PGID) với ps -o "%p %P %r %c %a":

$ ps -o "%p %P %r %c %a"
  PID  PPID  PGID COMMAND         COMMAND
12124 12123 12124 zsh             -zsh
12212 12124 12212 man             man kill
12226 12212 12212 less            less
12302 12124 12302 ps              ps -o %p %P %r %c %a

Vì vậy, mancùng với công cụ hiển thị máy nhắn tin ( less) nằm trong cùng một nhóm quy trình, nhưng nó khác với trình bao (zsh trong trường hợp của tôi).

(2) Có thể có hai killlệnh khác nhau . Một cái được tích hợp vào bash(xem bash (1), Phần "SHELL BUILTIN THÔNG TIN") và bên ngoài /bin/kill. Hai người này có thể cư xử khác nhau! Bạn có thể nói rõ ràng cái nào bạn muốn chạy bằng cách gõ builtin killhoặc command killthay vì kill. Lệnh bên ngoài bạn cũng có thể chạy bằng cách chỉ định đường dẫn : /bin/kill.


1
PPIDlà ID tiến trình cha , thường là, nhưng không nhất thiết là ID nhóm quy trình. Cột đúng là PGID, không xuất hiện trong psđầu ra mặc định ; bạn cần sử dụng -otùy chọn để xây dựng một định dạng tùy chỉnh bao gồm nó.
chepner

@chepner: Bạn hoàn toàn đúng, cảm ơn! Tôi đã bị nhầm lẫn bởi trang man ps (1) của Cygwin, trong đó ghi: "-l, --long: hiển thị các uids, ppids, pgids, winpids". Xấu hổ về tôi, tôi chỉnh sửa câu trả lời của mình cho phù hợp. Tuy nhiên, tuyên bố của tôi (chỉ người đàn ông + máy nhắn tin có cùng PGID) là chính xác, như dự định. (Trước cả câu đó cũng sai :-()
mpy

1

Để dừng tất cả các quy trình của bạn và tự đăng xuất, hãy nhập:

kill -kill 0

Điều này sẽ gửi tín hiệu 9, tín hiệu SIGKILL tới tất cả các quy trình có ID nhóm quy trình bằng với ID nhóm quy trình của người gửi. Vì shell không thể bỏ qua tín hiệu SIGKILL, điều này cũng dừng shell đăng nhập và đăng xuất bạn

Đây là Hướng dẫn AIX của IBM, nhưng có lẽ khái niệm này được áp dụng.

Chức năng này không tồn tại trong Linux "kill" (như tôi có thể thấy); nhưng đây là cách nó "giết" hành xử:

Giết 0 không giết pid 0. Thay vào đó, nó là một tùy chọn trong kill để giết tất cả các tiến trình trong nhóm hiện tại . Với lệnh của bạn, bạn đang giết tất cả mọi thứ trong ID nhóm quy trình (GID) của shell đã ban hành lệnh kill.

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.