在内核 4.1 及以上版本中,/proc/[pid]/status
包含以下 4 行:
NStgid: 1
NSpid: 1
NSpgid: 1
NSsid: 1
这允许父命名空间中的进程了解所有命名空间中该进程的 PID。但这些行仅在内核 4.1 中添加,因此内核 3.10 中没有它们。
那么,给定一个进程 PID,如何获取该进程在所有命名空间中的 PID,或者至少在内核 3.10 中获取该进程所属的最深层命名空间中的 PID?升级内核是不可能的,因为它是生产服务器,所以这么大的改变是非常困难的。
答案1
看/proc/[pid]/sched
:
$ cat /proc/8416/sched
bash (918, #threads: 1)
-------------------------------------------------------------------
se.exec_start : 2664031641.263979
se.vruntime : 2781932.438772
se.sum_exec_runtime : 5.544571
se.nr_migrations : 5
8416
是命名空间中的pid,918
是主机pid。
因此,给定主机 pid 918
,nsenter
它是命名空间并列出所有进程:
nsenter --target 918 --mount --uts --ipc --net --pid ps
PID USER TIME COMMAND
8416 java-app 0:00 /bin/bash
8606 root 0:00 -bash
15416 root 0:00 -bash
检查/proc/8416,8606,15416/sched
哪一个与主机 pid 匹配918
,这就是答案。