我正在尝试构建一个流程容器。容器会触发其他程序。例如 - 使用 '&' 启动运行后台任务的 bash 脚本。
我所追求的重要特性是:当我杀死容器时,它下面产生的所有东西都应该被杀死。不仅是直系子女,还有他们的后代。
当我开始这个项目时,我错误地认为当你杀死一个进程时,它的孩子也会自动被杀死。我曾向有同样错误想法的人寻求建议。虽然有可能捕捉到信号并将杀戮传递给儿童,但这不是我在这里要寻找的。
我相信我想要实现的目标,因为当你关闭一个 xterm 时,它里面运行的任何东西都会被杀死,除非它被 nohup'd。这包括孤立进程。这就是我想要重新创建的。
我有一个想法,我正在寻找的内容涉及 unix 会话。
如果有一种可靠的方法来识别进程的所有后代,那么能够向它们发送任意信号也会很有用。例如SIGUSR1。
我知道 Linux 命名空间,除此之外,还可以用来安全地处理限制和监禁子进程,而不会让它们被僵尸化和转储到init. 但我对实现细节很模糊。我如何使用util-linux诸如mountand提供的工具nsenter来监视、监视和确保启动的所有进程都是另一个进程的直接命名空间后代?
我有以下ps命令来获取所有正在运行的进程的特定属性以及一些属性:
ps --no-headers -exo "uname,ppid,pid,etime,%cpu,%mem,args"
Run Code Online (Sandbox Code Playgroud)
我希望将它格式化为 CSV 以便我可以解析它。注意我把 args 放在最后以方便解析;我不认为 a ,will 存在于任何其他列中 - 如果我错了,请纠正我。
如何去除空格?
从这个答案中我们了解到,您可以通过 Linux PID 命名空间实现对整个进程子树的可靠终止unshare -p。
这是我不明白的问题:
仅当我使用-f/--fork选项取消共享时它才有效。
unshare -fp -- bash -c "watch /bin/sleep 10000 && echo hi"
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,kill -9那个的PID bash,然后观看,睡眠等都死了,正如我所希望的那样。
但是当我使用它时没有-f:
unshare -p -- bash -c "watch /bin/sleep 10000 && echo hi"
Run Code Online (Sandbox Code Playgroud)
和kill -9bash PID,然后将其watch重新设置为PID 1(在我的Ubuntu上是systemd),所以我没有达到杀死所有孩子的预期效果。
问题:
--fork必须要达到预期的效果?为什么不unshare使用exec()fork 还不够?kill -9而创建的 PID 。unshare但是当我使用 时--fork,杀死我开始时返回的 pidunshare将简单地杀死unshare并bash …