我有一个服务器,我想将其添加到 systemd 中,以便它自动启动并在崩溃时重新启动。
服务器必须是守护进程吗?
答案1
是的。由服务管理器(例如 systemd)启动的进程在守护进程上下文中运行。
但请注意成为守护进程的实际含义。引用巴赫的话:
UNIX 系统中的进程可以是用户进程、守护进程或内核进程。典型系统上的大多数进程都是用户进程,与终端上的用户相关联。 守护进程进程不与任何用户关联,但执行系统范围的功能,例如[...]。
——莫里斯·J·巴赫 (1986)。UNIX操作系统的设计。普伦蒂斯·霍尔。 ISBN 01320177571。第 238 页。
这与程序是否分叉无关;以及与进程是否与用户登录会话关联有关的所有内容。如果您想要作为服务进行管理的程序执行系统范围的功能并且不应该与用户登录会话关联,那么它可以在守护进程上下文中运行。你可以将它包装在一个systemd服务单元中,并使用systemd来管理它。 (或者您可以使用其他服务管理工具集执行类似的操作。)
(systemd 的概念是每用户服务,它们与用户登录会话、X 服务器、每用户运行时目录、每用户桌面总线代理和 PAM 之间的关系有些复杂;这是这个 WWW 站点上很多问题的根源。上述内容涉及到全系统然而,systemd 中的服务,这可能就是您所想到的。)
当然,为了获得最佳结果,程序不应分叉为“dæmonize”。 “恶魔化”的想法是用户进程可以产生守护进程流程。自 20 世纪 80 年代以来,情况并非如此,原因超出了本答案的范围,而且这个想法是有缺陷的。无论如何,对于在 systemd、daemontools、nosh 工具集、perp、s6、runit 和其他此类服务管理机制下运行的任何东西来说,它都是完全多余的。由此类服务管理器产生的进程是已经在守护进程上下文。
答案2
不,该进程不必是守护进程。在前台运行的进程可以由“简单”类型的 systemd 服务处理。
这Debian 维基甚至提到在前台运行是首选,并且大多数服务都使用“简单”类型。
作为守护进程运行的进程通常通过派生子进程来启动。要使用 systemd 处理此类进程,您需要“分叉”类型的服务。
还有一些其他类型,例如“oneshot”。请参阅systemd.service 手册页更多细节。