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 otrzymaSIGCHLDsygnał 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 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.