カーネル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
。それが答えです。