Một quá trình subreaper phạm vi là gì?


38

Từ "subreaper" được sử dụng trong một số câu trả lời. Tìm kiếm Google cũng xuất hiện các mục trong đó từ "chỉ được sử dụng".

Làm thế nào tôi có thể hiểu "tiểu đơn vị" là gì?


3
Tôi chưa bao giờ nghe từ trước. Bạn có thể bao gồm một số tài liệu tham khảo cho bối cảnh?
Celada

5
Đây là một: Tôi đã sử dụng nó trong một câu trả lời tại unix.stackexchange.com/a/177361/5132 .
JdeBP

Câu hỏi liên quan mà có lẽ tôi nên đăng ở đây thay vì tại serverfault serverfault.com/questions/747070/iêu
artfulrobot

Câu trả lời:


49

Điều này đã được triển khai cho nhân Linux 3,4 như một cờ của hệ thống gọi prctl () .

Từ prctl(2)trang hướng dẫn:

[...] Một người con hoàn thành vai trò của init(1)các quá trình hậu duệ của nó. Sau khi chấm dứt một quá trình mồ côi (tức là cha mẹ ngay lập tức của nó đã chấm dứt) và được đánh dấu là có một người con, người con tổ tiên còn sống gần nhất sẽ nhận được SIGCHLDtín hiệu và có thể wait(2)vào quá trình để phát hiện ra tình trạng chấm dứt của nó.

Một quá trình có thể định nghĩa chính nó như là một subreaper với prctl(PR_SET_CHILD_SUBREAPER). Nếu vậy, không phải init(PID 1) sẽ trở thành cha mẹ của các quá trình con mồ côi , thay vào đó, ông bà sống gần nhất được đánh dấu là một người con sẽ trở thành cha mẹ mới. Nếu không có ông bà sống thì initkhông.

Lý do để thực hiện cơ chế này là các nhà quản lý / giám sát dịch vụ không gian người dùng (như upstart, systemd) cần theo dõi các dịch vụ đã bắt đầu của họ. Nhiều dịch vụ được kích hoạt bằng cách tách đôi và được cấp lại hoàn toàn cho PID 1. Người quản lý dịch vụ sẽ không còn có thể nhận được SIGCHLDtín hiệu cho họ và không còn chịu trách nhiệm gặt hái cho trẻ em wait(). Tất cả thông tin về trẻ em bị mất tại thời điểm PID 1 dọn sạch các quy trình được cấp phép lại. Bây giờ, một quy trình quản lý dịch vụ có thể tự đánh dấu là một loại "tiểu khởi động" và giờ đây có thể trở thành cha mẹ cho tất cả các quy trình mồ côi được tạo bởi các dịch vụ bắt đầu. Tất cả các SIGCHLDtín hiệu sẽ được gửi đến người quản lý dịch vụ.

Trong Linux, một daemon thường được tạo bằng cách tách hai lần với quá trình trung gian thoát ra sau khi bỏ cháu. Đây là một kỹ thuật phổ biến để tránh các quá trình zombie . Kịch bản init gọi một đứa trẻ. Đứa trẻ đó lại một lần nữa và do đó thoát ra ngay lập tức. Đứa cháu sẽ được nhận nuôi init, nó liên tục kêu gọi wait()thu thập trạng thái thoát ra của con mình để tránh zombie. Với khái niệm về các đối tượng con, trình quản lý dịch vụ không gian người dùng giờ đây trở thành cha mẹ mới, thay vì init.


Vì vậy, tôi có thể nghĩ rằng quá trình "gặt hái" quy trình "phụ" không? Hoặc, quá trình này là một máy gặt "phụ" bởi vì máy gặt "chính" là init? Chỉ cần cố gắng nghĩ làm thế nào thuật ngữ được đặt ra. Cảm ơn câu trả lời!
kenchew

3
Theo liên kết Linux kernel 3.4 ở trên, nhận xét cam kết cho việc triển khai này có thêm thông tin chi tiết. (Awed bởi các chi tiết ẩn trong một bình luận git)
kenchew
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.