カーネル3.10でNSPidを取得する方法

カーネル3.10でNSPidを取得する方法

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

上記のインスピレーションはjattach thisから来ました。質問この犯罪

関連情報