Orphan process (proces osierocony) to proces, którego rodzic zakończył działanie, zanim zrobił to on sam. W systemach uniksowych każdy proces ma swojego rodzica (parent), a orphan nagle zostaje bez niego. System nie pozostawia go jednak samego sobie — natychmiast zostaje zaadoptowany przez proces init z PID 1 (na nowoczesnych dystrybucjach Linuksa najczęściej jest to systemd). Od tego momentu nowym rodzicem osieroconego procesu staje się PID 1.
Po co ta adopcja
To nie jest fanaberia, tylko sprzątanie. Gdy proces kończy działanie, nie znika od razu — zostaje w stanie zombie, dopóki rodzic nie odbierze jego kodu wyjścia funkcją wait() (tzw. reaping). Gdyby osierocony proces po zakończeniu nie miał kogo, kto go „odżałuje”, jego wpis tkwiłby w tablicy procesów w nieskończoność. Dlatego init przejmuje rolę rodzica: kiedy adoptowany proces się zakończy, init wywoła wait() i posprząta. Sam orphan w trakcie życia działa normalnie — adopcja dotyczy głównie tego, kto posprząta po jego śmierci.
Przykład z praktyki
Najczęściej spotkasz orphany przy daemonizacji. Klasyczny trik: proces robi fork(), rodzic natychmiast kończy działanie, a dziecko żyje dalej już jako sierota adoptowana przez init. Dzięki temu usługa odpina się od terminala i działa w tle. Możesz to podejrzeć: uruchom coś w tle (sleep 300 &), a potem sprawdź kolumnę PPID przez ps -o pid,ppid,cmd. Jeśli zabijesz shella-rodzica, PPID procesu zmieni się na 1 — masz na ekranie osieroconego procesa adoptowanego przez init.
Częste mity
- Orphan to nie zombie. Orphan żyje i działa, tylko stracił rodzica. Zombie już się zakończył i czeka na odebranie statusu. Łatwo je pomylić, bo orphan po śmierci na chwilę staje się zombie — tyle że tym zombie zajmie się init.
- Orphan to nie wyciek zasobów. Dzięki adopcji przez PID 1 system sam pilnuje sprzątania. Prawdziwy problem to zombie, których rodzic żyje, ale ignoruje
wait(). - Nie zawsze to init. Proces może ustawić się jako subreaper (
prctl(PR_SET_CHILD_SUBREAPER)) i wtedy to on, a nie PID 1, adoptuje osierocone potomstwo z własnego poddrzewa.
Pojęcia powiązane: zombie process, PID i PPID, fork() i wait(), init, systemd, daemon, reaping, subreaper, sygnał SIGCHLD.