【发布时间】:2013-12-01 01:01:01
【问题描述】:
今天在使用 Linux kernel namespaces 时遇到了一些困难,特别是将 unique PID namespace 内的 PID 与全局 PID 命名空间内的 PID 相关联
我需要能够执行以下操作之一:
a) 使用命名空间分配的 PID 从全局范围杀死进程
或
b) 将命名空间特定的 PID 转换为全局 PID,这样我就可以从全局范围中杀死 PID
或
c) 启用 PID 命名空间内的进程向我报告其全局 PID,以便我可以从全局范围中终止 PID
有一些关于在命名空间场景here 中包含 PID 信息的进程结构的讨论。我不确定如何/是否可以从用户级应用程序访问这些结构,或者我是否需要通过内核 hack 添加支持。
为什么? 我有一个当前使用网络命名空间的应用程序。我正在添加对 PID 命名空间的支持。以下是它目前的工作方式:
在引入 PID 命名空间之前: 主应用程序当前在另一个网络命名空间中启动一个 bash 控制台。然后它使用该 bash 控制台启动程序并让这些程序报告它们当前的 PID。当主应用程序想要杀死该网络命名空间中的子进程时,它只是告诉操作系统杀死返回的 PID。
使用 PID 命名空间(中断状态): 主应用程序当前在另一个网络和 PID 命名空间中启动一个 bash 控制台。然后它使用该 bash 控制台启动程序并让这些程序报告它们当前的 PID。但是,返回的当前 PID 在全局 PID 命名空间中无效(可能是 10,当全局命名空间中的 PID 为 56000 时)。结果,主应用程序无法杀死该网络+ PID命名空间中的子进程
一如既往,感谢任何指导
【问题讨论】:
-
除非您在内核中,否则如何在命名空间之间转换 pid 绝对不明显。但是既然你可以让你的 bash 控制台启动程序,为什么不让它启动
kill -9 pid程序,其中pid是受害者在 bash 控制台的 pid 命名空间中的 pid? -
bash 控制台已经被交互式地用于显示正在执行的应用程序。我在这里破解了一个开源软件,所以我可以改变一些东西,但我在某种程度上受到了限制
-
我不完全确定我是否完全理解您的问题域,但是 afaik,可以禁用 pid 命名空间并仅使用网络命名空间,在这种情况下,由新 bash shell 创建的进程不会无效,您可以从那里杀死它。
-
@rakib 是的——以前的状态只是使用网络命名空间。现在我也想使用 PID 命名空间(我正在添加这个功能)。
-
@BSchlinker 使用 PIDNS 的整个概念是将其与主机的 PIDNS 隔离,如果有人试图从主机中杀死它,我认为它不应该允许这样做,或者也可能存在安全问题。如何纠正将访问 shell 并终止进程的脚本。就好像你可以从 shell 运行脚本一样。
标签: c linux kernel pid linux-namespaces