Co to jest proces „subreaper”?

38

Słowo „subreaper” jest używane w niektórych odpowiedziach. Wyszukiwarka Google wyświetla również wpisy, w których słowo to jest „tylko używane”.

Jak mogę zrozumieć, co to jest „subreaper”?

kenchew
źródło
3
Nigdy wcześniej nie słyszałem tego słowa. Czy możesz podać jakieś odniesienia do kontekstu?
Celada,
5
Oto jeden: użyłem go w odpowiedzi na unix.stackexchange.com/a/177361/5132 .
JdeBP,
Powiązane pytanie, które być może powinnam zamieścić tutaj zamiast na serverfault serverfault.com/questions/747070/…
artfulrobot

Odpowiedzi:

49

Zostało to zaimplementowane w jądrze Linuksa 3.4 jako flaga wywołania systemowego prctl () .

Z strony prctl(2)podręcznika:

[...] Żniwiarz spełnia rolę init(1)swoich potomnych procesów. Po zakończeniu procesu, który jest osierocony (tj. Jego bezpośredni rodzic już się zakończył) i jest oznaczony jako posiadający podrzędną, najbliższa wciąż żyjąca podrzędna podrzędna otrzyma SIGCHLDsygnał i będzie w stanie wait(2)wykryć swój status zakończenia.

Proces może definiować się jako podrzędny za pomocą prctl(PR_SET_CHILD_SUBREAPER). Jeśli tak, to nie initPID 1 stanie się rodzicem osieroconych procesów potomnych , zamiast tego najbliższy żyjący dziadek oznaczony jako podrzędny zostanie nowym rodzicem. Jeśli nie ma żyjącego dziadka, to initrobi.

Powodem wdrożenia tego mechanizmu było to, że menedżerowie / przełożeni usług przestrzeni użytkownika (jak upstart, systemd) muszą śledzić swoje uruchomione usługi. Wiele usług demonizuje się przez podwójne rozwidlenie i pośrednio zostaje ponownie nadanych do PID 1. Menedżer usług nie będzie już mógł odbierać SIGCHLDdla nich sygnałów i nie będzie już odpowiedzialny za zbieranie dzieci wait(). Wszystkie informacje o dzieciach są tracone w chwili, gdy PID 1 oczyszcza ponownie wychowane procesy. Teraz proces menedżera usług może oznaczać się jako swego rodzaju „podinicjalizacja” i może pozostać nadrzędny dla wszystkich osieroconych procesów utworzonych przez uruchomione usługi. Wszystkie SIGCHLDsygnały zostaną dostarczone do kierownika serwisu.

W systemie Linux demon jest zwykle tworzony przez rozwidlenie dwukrotnie, a proces pośredni kończy się po rozwidleniu wnuka. Jest to powszechna technika pozwalająca uniknąć procesów zombie . Skrypt init wywołuje dziecko. To dziecko znów się rozwidla i natychmiast wychodzi. Wnuk zostanie adoptowany przez init, który stale wzywa wait()do odebrania statusu wyjścia swoich dzieci, aby uniknąć zombie. Dzięki koncepcji podrzędnych menedżer usług przestrzeni użytkownika staje się teraz nowym nadrzędnym zamiast init.

chaos
źródło
Czy mogę więc myśleć, że proces „zbiera” proces „pod”? A może proces jest żniwem „podrzędnym”, ponieważ żniwiarzem „głównym” jest init? Próbuję tylko pomyśleć, jak powstał ten termin. Dziękuję za odpowiedź!
kenchew
3
Po powyższym linku do jądra Linuksa 3.4 komentarz zatwierdzenia dla tej implementacji zawiera dalsze szczegóły. (Zaskoczony szczegółami ukrytymi w komentarzu git)
kenchew