Что такое процесс «поджатка»?

39

В некоторых ответах используется слово «поджатник». Поиск в Google также приводит к появлению записей, где слово «только что использовалось».

Как я могу понять, что такое «поджатник»?

kenchew
источник
3
Я никогда не слышал это слово раньше. Можете ли вы включить некоторые ссылки для контекста?
Селада
5
Вот один: я использовал его в ответе на unix.stackexchange.com/a/177361/5132 .
JdeBP
Смежный вопрос, который, возможно, мне следовало бы разместить здесь, а не на serverfault serverfault.com/questions/747070/…
artfulrobot

Ответы:

50

Это было реализовано в ядре Linux 3.4 как флаг системного вызова prctl () .

Из prctl(2)справочной страницы:

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

Процесс может определить себя как подчиненный с prctl(PR_SET_CHILD_SUBREAPER). Если это так, initродитель (родительский родительский процесс ), который не является (PID 1), станет родителем сирот , а вместо него ближайший родительский родитель , помеченный как подчиненный, станет новым. Если нет живого прародителя, initзначит.

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

В Linux, как правило, создается демон, который дважды разветвляется, когда промежуточный процесс завершает работу после разветвления внука. Это обычная техника, позволяющая избежать зомби-процессов . Скрипт инициализации вызывает ребенка. Этот ребенок снова разветвляется и, таким образом, немедленно выходит. Внук будет усыновлен init, который постоянно призывает wait()собирать статусы выхода своих детей, чтобы избежать зомби. С концепцией подзадач менеджер службы пользовательского пространства теперь становится новым родителем, а не init.

хаос
источник
Итак, могу ли я думать, что процесс "пожинает" "sub" -процесс? Или этот процесс является «подчиненным» жнецом, потому что «основным» жнецом является init? Просто пытаюсь придумать, как этот термин был придуман. Спасибо за ответ!
Кенчев
3
Следуя приведенной выше ссылке на ядро Linux 3.4 , комментарий коммита для этой реализации содержит дополнительную информацию. (В восторге от подробностей, спрятанных в git-комментарии)
Кенчев