为什么守护进程会分叉?

Mat*_*tty 18 fork daemon

我知道一些(所有?)守护进程在启动时会分叉.我的印象是,将子进程作为权限较低的用户运行,特别是如果守护进程类似于HTTP服务器.

为什么这有必要呢?如果没有分支子进程,进程是否无法启动并删除其权限?它是"强制性的"分叉,还是有其他特殊原因(除了运行多个子工作进程)?

我是新手,非常感谢我能得到的所有帮助.

P S*_*ved 20

我认为守护进程有几个原因:

  1. 一个原因是将进程与启动它的任何shell分离.有些炮弹(例如Bash)会在退出时杀死儿童,除非采取特殊的,特定于炮弹的预防措施.分叉是避免这种情况的通用方法.

  2. 另一个原因是报告守护程序已成功启动.

    假设它没有分叉.你怎么知道守护进程已成功启动?您不能只读取和解析守护程序输出,因为守护程序管理程序应该以通用方式执行.所以唯一的方法是获取程序的返回代码.

    实际上,如果守护程序无法启动(例如,它找不到配置文件),您会立即知道.但是,嘿,如果一个守护进程已成功启动,它可能永远不会返回!因此,您的守护程序管理器无法知道守护程序是否仍在尝试启动或已启动,并且正在运行.Fork可以解决问题,如果fork运行良好,分叉程序将返回成功.

  3. 至于特权,投下他们以后execve是不是这样做之前安全的要少得多execve.这是fork方便的另一个原因.


Gia*_*omo 7

守护进程必须分叉两次,因为它们必须独立于其他进程,即没有办法杀死守护进程杀死另一个进程,并且必须在后台运行,而不是连接到终端.

在启动时,守护进程叉和父进程死亡.这使得分叉进程成为子进程init,因此基本上它与其他进程无关.

在第二个分支上,孩子不再是过程领导者,而是与终端分离.

其他好的做法可能适用,阅读简单守护进程的源代码可能很有见地.

  • 有一个写得很好的简单守护进程的任何建议吗?我愿意打赌有一些要避免...... (2认同)