【问题标题】:Is forking in a daemon still necessary when using systemd?使用 systemd 时是否仍然需要在守护进程中分叉?
【发布时间】:2020-08-28 09:47:28
【问题描述】:

我创建了一个脚本,它应该作为守护进程运行,由 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。

我是对的还是在守护进程内部分叉并退出父进程还有什么好处?

【问题讨论】:

    标签: fork daemon systemd


    【解决方案1】:

    你是对的。分叉现在 100% 由 systemd 环境处理,因此实际上不需要在该领域做任何事情。它甚至将您可以在StopExec=... 中访问的PID 保存为$MAINPID

    StopExec=/bin/kill "$MAINPID"
    

    如果您的守护进程具有分叉功能,您可以将其与分叉类型一起使用:

    [Service]
    type=forking
    

    但是,如果您的守护程序中没有任何分叉机制,请不要实现它。没用。

    请注意,从命令行,您始终可以使用& 在后台启动它。这是明确的。人们可以清楚地理解它是如何工作的。

    另外一点,许多人会使用 PID 文件来保存该标识符并使​​用它来终止 stop 上的进程。该 PID 文件还有助于防止管理员启动同一服务的第二个实例。再一次,systemd 会处理这个问题。您最多可以拥有任何服务的一个实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-12
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 2012-10-15
      相关资源
      最近更新 更多