我试图理解/usr/sbin/service
具有一行代码的经典服务脚本:
exec env -i ...... ${SERVICE} .....
Run Code Online (Sandbox Code Playgroud)
我知道该exec
命令不会分叉,并将保留该进程并将进程映像替换为 COMMAND。那么当前的进程就像用命令执行一样。
怎么样的env
?它也会像上面那样吗?
为什么替换当前进程比分叉更好?
它使用的原因env -i
是在执行命令的其余部分之前清除环境变量。
不过,要真正回答您的问题,请考虑 Windows:
在 Windows 中,它们为您提供“CreateProcess”,这似乎是启动新程序的一种非常明智的方式。但是 CreateProcess 的问题是您可能希望为新进程设置几十个设置,并且对于每个设置,您都需要另一个参数来调用 CreateProcess 函数。这限制了父母对孩子的控制程度。
在 Unix 中,他们提出了一个想法,即一个进程首先克隆自己(继承所有进程设置),然后第二个副本可以更改其设置,最后用新程序替换自己。这使您可以使用任何/所有系统调用来更改诸如当前目录、环境、文件句柄、打开的套接字、信号掩码等内容,而无需将其中的每一个都作为参数添加到 CreateProcess 之类的内容中。
然后,一个巧妙的能力是“链接”执行不同启动操作的程序。每个程序都会改变自己的一些东西,然后“执行”到下一个程序中。 env
是这些程序之一。它修改自己的环境,然后执行另一个程序。有关您可以在要启动的程序中更改的所有内容的一个很好的示例,请参阅chpst。