1

我有一个类似于以下内容的二进制文件:

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

谢谢

4

0 回答 0