我正在寻找一种运行进程的方法,该进程本身可能会产生更多子进程/孙进程/等子进程。然后:
- 能够向所有后代发送信号(例如 TERM 或 KILL)。
- 能够确保当主进程退出时,所有后代进程都被终止(通过终止它们或者因为我们已经等待它们全部自愿退出)。
“所有后代”应包括使用相同方法创建自己的内部进程组的后代。因此,无论我们使用什么方法,它都应该支持嵌套,否则进程就有办法通过创建自己的秘密会议来逃避我们的监督。
虽然这听起来像是一项简单的任务,但各种记录的方法都以不同的微妙方式失败了。
setsid
留下孤立的后代 - 它只能等待顶级进程。我也不认为它可以嵌套,因为会话不能嵌套。- Yelp
dumb-init
不能嵌套(不使用--single-process
)。 bwrap
可以创建一个 PID 命名空间并init
在其中运行,这似乎已经完成一半,但是它不能等到所有子进程都退出。- 我尝试
dumb-init
与结合使用bwrap --as-pid-1
,这似乎使我们更进一步,但是,向整个组发送 SIGKILL 的唯一方法是使用 的dumb-init
功能将另一个信号映射到 KILL--rewrite
。这会破坏嵌套:将信号映射到外部的 SIGKILLdumb-init
只会杀死内部的dumb-init
,而其他内部进程仍在运行。 - 在容器(
docker
或podman
)中运行命令确实可以实现这些目标。但是,这是一个重量级的解决方案,需要额外的工作来设置,并禁用其他类型的隔离(例如文件系统或 UID)并启用嵌套(DinD 等)。
我忽略了什么吗?