Daemon和正常运行的进程有什么区别?

Daemon和正常运行的进程有什么区别?

我一直在为基于 Linux 的嵌入式系统使用 python 实现各种服务。有一个驱动程序服务需要在系统启动后就永远运行。它及时生成其他服务作为子进程,并继续循环这部分。我想要实现的主要目标是,除非系统关闭,否则该驱动程序服务永远不会停止。我有以下选择:

  • 将此服务设为系统守护程序并让其持续运行
  • 将此服务作为正常进程启动并让它持续运行

我应该选择哪个选项,为什么?另外,这两种方法之间的根本区别是什么?

答案1

我将首先解决问题标题:守护进程和正常运行进程之间的区别是,大多数时候,当您说“正常进程”时,您指的是连接到用户输入/输出 API 的东西,例如文本终端(通常通过打开文件描述符表中的前 3 个文件描述符并将其连接到某种虚拟终端),或图形用户界面(在 Linux 和 UNIX 上通常使用 X11 协议)。另一方面,守护进程通常指的是已从终端分离的进程,或者从一开始就从未附加到终端的进程。

至于问题本身,无论是作为守护进程运行还是作为“正常进程”运行时,应用程序都可能崩溃并需要重新启动。当进程连接到某个用户终端时,用户可以检测到故障并重新启动应用程序,但守护进程通常不享受该功能 - 当守护进程与终端断开连接时,这使得检测到该故障变得更加困难进程已崩溃。

为了解决这个问题,我们发明了服务管理框架。有许多不同的实现,具有不同的功能:SysV、SystemD、Upstart、Supervisord、runit 等等。它们都有一个非常重要的功能:它们有某种方法来启动守护进程(通常在启动时自动启动)监视它,直到它失败,然后再次启动它。

您应该使用服务管理框架来运行设备驱动程序服务吗?你绝对应该这样做——这是唯一明智的方法。

使用哪种服务管理软件,是一个比较困难的问题。通常,最好的选择是使用操作系统捆绑的任何服务管理软件 - 通常该软件也以进程 ID 0 运行并直接由内核启动。目前,现代基于 Linux 的操作系统中最突出的此类软件是 SystemD,它提供了许多功能,例如丰富的依赖管理语言、套接字激活、计时器、网络和存储管理等。 AFAIK,在嵌入式 Linux 操作系统中,这种情况并不常见,并且您的嵌入式系统可能使用经典的 SysV,它不太擅长重新启动失败的服务(或者通常根本不这样做 - 它将该任务留给“服务”)脚本”并且大多数实现不执行任何类型的重新启动)。对于基于 SysV 的操作系统,许多管理员更喜欢使用 SysV 服务框架来启动另一个服务管理器(例如supervisord 或 runit)并让其管理他们的服务。

相关内容