Làm thế nào để bạn giết một cây quá trình trong linux? [đóng cửa]


14

Đôi khi, việc gửi SIGTERM đến một quy trình sẽ khiến nó gửi SIGTERM tới tất cả các quy trình con của nó. Tuy nhiên, đôi khi điều này không hoạt động.

Có một lệnh hoặc một tiện ích sẽ cho phép tôi giết một tiến trình và tất cả các tiến trình con của nó cùng một lúc không? Tôi thường dùng thủ công để thu thập tất cả các pids vào một lệnh kill, nhưng nó cảm thấy thật ngu ngốc.

Câu hỏi SO này hỏi làm thế nào để làm điều này với perl, nhưng bất cứ điều gì hoàn thành công việc sẽ rất tuyệt.


Hình như pkill -9là mạnh hơn pkill, vì bất cứ lý do gì.
Andrew

Câu trả lời:



13

Giả sử rằng các quy trình chia sẻ một mã định danh phiên (mà chúng nên trừ khi chúng được gọi rõ ràng là setsid (), bạn có thể giết chúng bằng phiên bằng cách sử dụng pkill:

user@machine:~> ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12916 12804 ps -o pid,sess,cmd -U user
user@machine:~> sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12920 12804 sh
12921 12804 sh
12922 12804 sh
12924 12804 sh
12926 12804 sh
12928 12804 sh
12937 12804 ps -o pid,sess,cmd -U user
sh-3.00$

Nếu từ thiết bị đầu cuối khác tôi làm:

pkill -9 -s 12804

Sau đó, tất cả mọi thứ chết trong một swoop rơi.

Bạn có thể giết tương tự theo nhóm quy trình, mặc dù điều này có xu hướng hữu ích hơn đối với nhiều trẻ em chỉ ở một cấp dưới cha mẹ, không phải là một chuỗi các quy trình liên quan.


2

Thông thường, một khách hàng phản hồi sẽ nhận được một sigterm và tự tắt, do đó chấm dứt tất cả các quá trình con rẽ nhánh của nó. Mặt khác, nếu khách hàng không phản hồi, tín hiệu chấm dứt bình thường có thể sẽ gợi lên không có phản hồi.

Vì vậy, sau đó bạn tiến hành gửi SIGKILL, thông báo cho chính hệ thống thực hiện Dừng quá trình đó, ngay bây giờ - việc này có thể thực hiện hầu hết thời gian, ngoại trừ khi quá trình ở trạng thái ngủ không liên tục, như chờ một số I / O đầu vào hoặc tương tự.

Trong trường hợp đó, thậm chí SIGKILL cuối cùng sẽ không làm gì với quy trình; quá trình con có thể sẽ ở trạng thái chậm tương tự.

Có một trường hợp biên giới trong đó quy trình cha mẹ có thể chấm dứt độc đáo, nhưng quy trình con không thể bị giết. Sau đó, bạn sẽ kết thúc với một quá trình zombie không thể được dọn sạch vì cha của nó đã biến mất, nhưng nó không đáp ứng với bất cứ điều gì. Cách duy nhất để thoát khỏi những thứ đó là khởi động lại; Tuy nhiên, trong hầu hết các trường hợp, chúng khá vô hại, vì điều duy nhất chúng làm là chiếm lấy một bộ điều khiển trong khi bất kỳ ổ cắm nào chúng cố gắng sử dụng đã bị héo đi.


2

Nếu tôi muốn giết cây quy trình của Firefox, thì có thể giết nó bằng lệnh trên "pkill -9 -s firefox"

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.