Kill 0 thực sự làm gì? [đóng cửa]


22

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

kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
 pid... Specify the list of processes that kill should signal.  Each pid can be one of five things:
          0      All processes in the current process group are signaled

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

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

Ở đây 0được sử dụng như pid. 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ó?


Nó gửi một SIGTERMquá trình, mà nó đã làm. Các manlệnh đã chọn để bỏ qua nó.
jordanm

5
@jordanm, không. một công việc được bắt đầu bởi một shell tương tác có một nhóm quy trình khác với shell. Đó là cách cái vỏ có thể đặt nó ở nền trước và nền sau. Xem ps -jđể xem các nhóm quá trình.
Stéphane Chazelas

1
Câu hỏi này thực sự là một bản sao của câu hỏi SuperUser Điều gì làm kill 0 thực sự? (được di chuyển từ StackOverflow). Xem thêm câu hỏi về kill -0(lưu ý các dấu gạch ngang), mà là một chủ đề khác nhau, tại StackOverflow và đây trên Unix.SE .
Adam Katz

Câu trả lời:


27

Giống như nó nói, nó sẽ gửi tín hiệu cho tất cả các thành viên của nhóm quy trình của người gọi.

Các nhóm quy trình được sử dụng để thực hiện kiểm soát công việc trong shell (chúng có thể được sử dụng cho những thứ khác, nhưng kiểm soát công việc shell tương tác là lý do chính cho sự tồn tại của chúng).

Bạn sẽ nhận thấy rằng khi bạn nhập Ctrl-C, tất cả các quy trình của các công việc hiện tại sẽ bị hủy, không chỉ quy trình bắt đầu chúng. Ngoài ra, điều đó không giết chết các công việc nền.

Điều đó đạt được với các nhóm quy trình. Công việc là một nhóm các quy trình được bắt đầu bởi một trình bao mà trình bao có thể đặt ở chế độ nền hoặc tiền cảnh (được đặt làm nhóm quy trình tiền cảnh của thiết bị đầu cuối hoặc không) và giết toàn bộ.

Bạn có thể tìm hiểu về id nhóm quá trình và id phiên với ps -j( jđể Jkiểm soát ob).

Để tiêu diệt nhóm quy trình của PGID $x, bạn làm:

kill -- "-$x"

kill 0 giết chết nhóm quá trình của người gọi

Lưu ý rằng nếu bạn làm : /bin/kill 0, shell sẽ bắt đầu một công việc mới để thực thi killlệnh đó , vì vậy killsẽ chỉ tự giết.

killthường là một vỏ dựng sẵn, vì vậy killsẽ giết chết nhóm quá trình của vỏ.

Tuy nhiên, khi shell tương tác, đó là quy trình quản lý các nhóm quy trình, do đó, thông thường không có quy trình nào khác trong nhóm quy trình của hệ vỏ. Tất cả các quy trình được bắt đầu bởi trình bao, nằm trong các nhóm quy trình khác:

$ sleep 1000 &
[1] 22746
$ ps -j
  PID  PGID   SID TTY          TIME CMD
22735 22735 22735 pts/23   00:00:00 zsh
22746 22746 22735 pts/23   00:00:00 sleep
22749 22749 22735 pts/23   00:00:00 ps

Ở trên, sleeppsnằm trong hai nhóm quy trình khác nhau, một trong nền, một ở nền trước và chúng khác với nhóm quy trình của trình bao.

Bạn có thể làm mặc dù:

(man kill & sleep 1; ps -j; kill 0)

Lớp vỏ tương tác sẽ bắt đầu một nhóm quy trình mới cho lớp con đó, và cả lớp con và con người (và các lệnh khác được bắt đầu bởi người đàn ông như máy nhắn tin của bạn, groff ...) sẽ nằm trong cùng một nhóm quy trình, do đó kill 0sẽ hoạt động ở đó. ( sleepở trên là để cung cấp đủ thời gian cho máy nhắn tin bắt đầu để chúng ta có thể nhìn thấy nó trong ps -jđầu ra trước khi chúng ta giết nó).


kill -- -$xthực sự nói bash: kill: (-63531) - No such processtrong bash 5.0.11 (1) - phát hành trên MacOS 10.14 nhưng chắc chắn quá trình này tồn tại và đang chạy. pkill -Phoạt động tốt
kyb

1
@kyb $ x phải là id nhóm quy trình chứ không phải id xử lý. Xem kết quả đầu ra ps -jđể tìm hiểu về pgids
Stéphane Chazelas
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.