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”?
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”?
Odpowiedzi:
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 otrzymaSIGCHLD
sygnał i będzie w staniewait(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 init
PID 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 init
robi.
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ć SIGCHLD
dla 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 SIGCHLD
sygnał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
.