Linux内核4.x+下如何从Docker容器内部获取宿主机PID?
获取容器内进程对应的宿主机PID(内核4.x+环境)
为什么旧方法失效
Linux内核4.x之后,为了强化PID namespace的隔离性,/proc/[pid]/sched文件中不再暴露宿主机的真实PID,仅显示容器内的本地PID,这就是你在RHEL8+Docker20.10环境下旧方法失效的原因。
可行的替代方法
利用/proc/[pid]/status文件中的NSpid字段,该字段会列出进程在所有层级PID namespace中的PID值,第一个数值即为宿主机的真实PID,第二个是容器内的本地PID。
操作步骤
在容器内确定目标进程的本地PID,比如你提到的
sleep进程PID为37。执行以下命令提取宿主机PID:
grep NSpid /proc/37/status输出示例:
NSpid: 27062 37
其中27062就是宿主机上对应的真实PID。也可以用awk直接提取宿主机PID:
awk '/NSpid/ {print $2}' /proc/37/status
注意事项
- 该方法无需特殊权限,只要容器未被限制访问
/proc文件系统(Docker默认允许)即可使用。 NSpid字段是Linux内核3.8版本后引入的,RHEL8的4.18内核完全支持。
内容的提问来源于stack exchange,提问作者Muzammil
相关产品推荐
相关产品推荐

