使用 systemd 时是否仍然需要在守护进程中分叉?
Is forking in a daemon still necessary when using systemd?
我创建了一个脚本,它应该 运行 作为守护进程,由 systemd 控制。我遇到了像 What is the reason for performing a double fork when creating a daemon? 这样的古老问题和古老的文档,这表明守护进程应该从终端分离。
但是在 2020 年,使用 systemd,所有这些对我来说似乎都过时了。据我所知(在 https://jdebp.eu/FGA/unix-daemon-design-mistakes-to-avoid.html 的支持下),不需要从任何终端分离,不需要避免僵尸进程等。整个分叉和退出只有在我想的时候才有意义从终端手动启动守护程序,而不是使用 systemd。
我说得对吗?在守护进程内部分叉并退出父进程是否还有任何好处?
你是对的。分叉现在 100% 由 systemd 环境处理,所以真的不需要在那个领域做任何事情。它甚至将您可以在 StopExec=...
中访问的 PID 保存为 $MAINPID
:
StopExec=/bin/kill "$MAINPID"
如果您的守护进程具有分叉功能,您可以将其与分叉类型一起使用:
[Service]
type=forking
但是如果您的守护进程中没有任何分叉机制,请不要实施它。没用。
请注意,从命令行,您始终可以使用 &
在后台启动它。这是明确的。人们可以清楚地理解它是如何工作的。
还有一点,许多人会使用 PID 文件来保存该标识符并使用它来终止 stop
上的进程。该 PID 文件还有助于防止管理员启动同一服务的第二个实例。同样,systemd 会处理这个问题。您最多可以拥有任何服务的一个实例。
我创建了一个脚本,它应该 运行 作为守护进程,由 systemd 控制。我遇到了像 What is the reason for performing a double fork when creating a daemon? 这样的古老问题和古老的文档,这表明守护进程应该从终端分离。
但是在 2020 年,使用 systemd,所有这些对我来说似乎都过时了。据我所知(在 https://jdebp.eu/FGA/unix-daemon-design-mistakes-to-avoid.html 的支持下),不需要从任何终端分离,不需要避免僵尸进程等。整个分叉和退出只有在我想的时候才有意义从终端手动启动守护程序,而不是使用 systemd。
我说得对吗?在守护进程内部分叉并退出父进程是否还有任何好处?
你是对的。分叉现在 100% 由 systemd 环境处理,所以真的不需要在那个领域做任何事情。它甚至将您可以在 StopExec=...
中访问的 PID 保存为 $MAINPID
:
StopExec=/bin/kill "$MAINPID"
如果您的守护进程具有分叉功能,您可以将其与分叉类型一起使用:
[Service]
type=forking
但是如果您的守护进程中没有任何分叉机制,请不要实施它。没用。
请注意,从命令行,您始终可以使用 &
在后台启动它。这是明确的。人们可以清楚地理解它是如何工作的。
还有一点,许多人会使用 PID 文件来保存该标识符并使用它来终止 stop
上的进程。该 PID 文件还有助于防止管理员启动同一服务的第二个实例。同样,systemd 会处理这个问题。您最多可以拥有任何服务的一个实例。