Není.
Hlavní proces řeší smrt svých dětí normálním způsobem.
Toto je svět POSIX. Jestliže proces A rozvětvil B a proces B rozvětvil C, D a E; pak proces B je to, co vidí SIGCHLD
a wait()
stav od ukončení C, D a E. Proces A neví, co se stane s C, D a E, a to bez ohledu na systemd.
Aby si A uvědomil, že C, D a E končí, musí se stát dvě věci.
- A musí se zaregistrovat jako "subreaper". systemd to dělá, stejně jako různí další správci služeb včetně upstart a nosh
service-manager
. - B musí mít
exit()
. Dělají to služby, které se pošetile, chybně a marně pokoušejí „dæmonizovat“.
(S kevent()
se dá chytře na BSD. Ale to je otázka Linuxu.)
systemd
má koncept hlavního procesu. V dokumentaci systemd je to označováno jako „hlavní servisní proces“ nebo jednoduše „hlavní proces“.
Příklad 4 v dokumentaci systemd.service popisuje, že hlavní proces je vypočítán při Type=forking
.
Dokumentace pro Restart=
v dokumentaci systemd.service popisují různé možnosti spuštění služby ve vztahu k hlavnímu procesu.
Zde je klíčový text z „příkladu 4“ odkazovaného výše:
systemd bude službu považovat za službu v procesu ofinitalizace, zatímco původní program stále běží. Jakmile itexit úspěšně a zůstane alespoň jeden proces (andRemainAfterExit=no), je služba považována za spuštěnou.
Tradiční démon se často skládá pouze z jednoho procesu. Pokud tedy po ukončení původního procesu zůstane pouze jeden proces, systemd bude tento proces považovat za hlavní proces služby. V takovém případě bude proměnná $MAINPID dostupná v ExecReload=,ExecStop=atd.
V případě, že zůstane více než jeden proces, systemd nebude schopen určit hlavní proces, takže nebude předpokládat, že jeden existuje. V takovém případě se $MAINPID nerozšíří na nic. Pokud se však proces rozhodne zapsat tradiční soubor PID, systemd bude schopen číst hlavní PID odtud. Nastavte prosím odpovídajícím způsobem PIDFile=.