我知道一些(或者全部?)守护进程在启动时会进行分叉。我认为这是为了将子进程以较低的特权用户身份运行,特别是如果守护进程是像 HTTP 服务器这样的东西。
不过这样做是必要的吗?一个进程不能在不分叉子进程的情况下启动并降低其权限吗?这是否“强制”需要进行分叉操作,还是有其他特殊理由(除了运行多个子工作进程)?
我对此很新,并且希望得到所有可以得到的帮助。
我认为守护进程会出于以下几个原因而进行分叉:
一个原因是将进程与启动它的任何shell分离。某些shell(例如Bash)在退出时会杀死子进程,除非采取特殊的针对该shell的预防措施。分叉是一种通用的逃避方法。
另一个原因是报告守护进程已成功启动。
假设不进行分叉。你如何知道守护进程已成功启动?你不能只读取和解析守护进程的输出,因为守护进程管理程序应该以通用的方式执行此操作。因此,唯一的方法是获得程序的返回代码。
事实上,如果一个守护进程无法启动(例如找不到配置文件),你会立刻知道。但是,如果守护进程已经成功启动,则可能永远不会返回!所以你的守护进程管理程序无法知道守护进程是否仍在尝试启动,或者已经启动并正在工作。分叉将解决这个问题,并且如果分叉成功,分叉程序将返回成功。
至于权限,在execve
之后降低权限远不如在execve
之前这样做安全。这是分叉很方便的另一个原因。
init
的子进程,基本上它独立于其他进程。我认为这样做是为了使守护进程完全不依附于任何其他进程(如shell或类似进程)。通过fork并退出父进程,孤儿进程将被系统init进程“收养”。