Що таке "підреакторний" процес?


39

Слово "субреапер" використовується в деяких відповідях. У пошуку Google також з'являються записи, де слово "щойно використано".

Як я можу зрозуміти, що таке "субреапер"?


3
Я ніколи раніше не чув цього слова. Чи можете ви включити деякі посилання на контекст?
Целада

5
Ось один: я використав це у відповіді на unix.stackexchange.com/a/177361/5132 .
JdeBP

Пов’язане питання, яке, можливо, я мав би розмістити тут замість на сервері defaultfault
artfulrobot

Відповіді:


50

Це було реалізовано в Linux ядро ​​3.4 як прапор системного виклику prctl () .

На сторінці сторінки prctl(2):

[...] Підреактор виконує роль init(1)своїх процесів для нащадків. Після припинення процесу, який осиротів (тобто його найближчий батько вже припинився) і позначений як субреактор, найближчий ще живий предкаподавець отримає SIGCHLDсигнал та зможе wait(2)в процесі виявити його статус припинення.

Процес може визначати себе як підреактор з prctl(PR_SET_CHILD_SUBREAPER). Якщо так, то це не init(PID 1) , який стане батьком осиротілих дочірніх процесів , а найближчий живий прабатько, позначений як subreaper стане новим батьком. Якщо немає живих бабусь і дідусів, initробить.

Причиною реалізації цього механізму стало те, що менеджерам / супервізорам служб простору користувачів (як upstart, наприклад systemd) потрібно відстежувати розпочаті послуги. Багато служб демонструються шляхом подвійного розгортання та неявно перепороднюються до PID 1. Менеджер сервісів більше не зможе приймати SIGCHLDдля них сигнали, і більше не відповідає за отримання дітей wait(). Вся інформація про дітей втрачається в той момент, коли PID 1 очищає відновлювані процеси. Тепер процес управління диспетчером послуг може позначати себе як свого роду "суб-init", і тепер він може залишатися батьківським для всіх осиротілих процесів, створених запущеними службами. Усі SIGCHLDсигнали будуть доставлені менеджеру служби.

У Linux, демон зазвичай створюється шляхом двічі роздвоєння з проміжним процесом, що закінчується після прищеплення онука. Це поширена методика уникнення зомбі-процесів . Сценарій init викликає дитину. Ця дитина знову відщеплюється і, таким чином, негайно виходить. Онук буде усиновлений компанією init, який постійно закликає wait()збирати статус виходу своїх дітей, щоб уникнути зомбі. З концепцією субреаперів менеджер сервісного простору користувача тепер стає новим батьком замість init.


Отже, чи можу я подумати, що процес "пожинає" підпроцес? Або процес - це "суб" жнець, тому що "головний" жнець є init? Просто намагаюся подумати, як був введений термін. Дякую за відповідь!
kenchew

3
Після вищезгаданого посилання на ядро Linux 3.4 , коментар до виконання цього додатка містить додаткові деталі. (Очікується деталями, прихованими у коментарі до git)
kenchew
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.