我有一个类似于以下内容的二进制文件:
int RealMain() {
... runs forever ...
}
int main() {
clone(RealMain, ..., CLONE_NEWPID /*clone flags*/, ...);
_exit(0);
}
这个想法是启动一个进程,该进程通过 clone() 启动实际进程并退出。此模型的原因是“CLONE_NEWPID”标志。我需要应用程序在单独的 PID 命名空间中运行。因此,需要使用 CLONE_NEWPID 标志通过克隆创建实际的应用程序进程。
当我从命令行启动这个二进制文件时,一切正常。但是当我通过 Upstart 启动它时,clone() 失败,errno 设置为 EPERM,并且永远不会创建新的 PID 命名空间。由于上面的 clone() 调用,我在 Upstart 配置中使用了“expect fork”。这样我就可以将活跃度与执行 RealMain() 的子进程的生命周期联系起来。
expect fork
respawn
我想知道“expect fork”的实现和使用 CLONE_NEWPID 创建一个新的 PID 命名空间之间是否存在一些不好的交互。我找到了以下关于“expect fork”和 ptrace 问题的来源,但没有找到其他人报告 CLONE_NEWPID 的问题:
https://blueprints.launchpad.net/ubuntu/+spec/foundations-q-upstart-overcome-ptrace-limitations
谢谢