我知道一些(所有?)守护进程在启动时会分叉。我的印象是,将子进程作为权限较低的用户运行,特别是如果守护进程类似于HTTP服务器。
为什么这有必要呢?如果没有分支子进程,进程是否无法启动并删除其权限?它是“强制性的”分叉,还是有其他特殊原因(除了运行多个子工作进程)?
我是新手,非常感谢我能得到的所有帮助。
答案 0 :(得分:19)
我认为守护进程有几个原因:
一个原因是从任何启动它的shell中分离进程。有些炮弹(例如Bash)会在退出时杀死儿童,除非采取特殊的,特定于炮弹的预防措施。分叉是避免这种情况的通用方法。
另一个原因是报告该守护程序已成功启动。
假设它没有分叉。你怎么知道守护进程已成功启动?您不能只读取和解析守护程序输出,因为守护程序管理程序应该以通用方式执行。所以唯一的方法是获取程序的返回代码。
实际上,如果守护程序无法启动(例如,它找不到配置文件),您会立即知道。但是,嘿,如果一个守护进程已成功启动,它可能永远不会返回!因此,您的守护程序管理器无法知道守护程序是否仍在尝试启动或已启动,并且正在运行。 Fork可以解决问题,如果fork运行良好,分叉程序将返回成功。
至于权限,在execve
之后删除比在execve
之前安全性低得多。这就是为什么fork很方便的另一个原因。
答案 1 :(得分:7)
守护进程必须分叉两次,因为它们必须独立于其他进程,即没有办法杀死守护进程杀死另一个进程,并且必须在后台运行,而不是连接到终端。
在启动时,守护程序分叉和父程序死亡。这使得分叉进程成为init
的子进程,因此基本上它与其他进程无关。
在第二个分支上,孩子不再是流程领导者,而是从终端分离出来。
其他好的做法可能适用,阅读简单守护进程的源代码可能很有见地。
答案 2 :(得分:3)
我的印象是这样做是为了让守护进程完全不与任何其他进程(如shell或类似进程)挂钩。通过分离和退出父进程,孤立进程将被系统初始化进程“采用”。
答案 3 :(得分:3)
在Unix环境中,父级 守护进程通常是(但不是 总是)init进程(PID = 1)。 进程通常成为守护进程 分叉子进程然后 有他们的父进程 立即退出,从而导致init 采用儿童过程。这是一个 有点简化的观点 过程与其他操作一样 一般表演,如 将守护进程与...分离 任何控制tty。方便 存在诸如守护进程(3)之类的例程 一些用于此目的的UNIX系统。
基本上,流程需要与其他流程以及终端等解除关联。