別のpid名前空間にある子プロセスのプロセスIDを確認できますか?

別のpid名前空間にある子プロセスのプロセスIDを確認できますか?

別のPID名前空間にある子プロセスのPIDを見つけることができますか?

親名前空間に基づいて子プロセスPIDを取得できますが、子プロセスが現在実行されている別のPID名前空間に基づいて子プロセスのPIDを見つける必要があります。

IPCを介して子プロセスからPIDを取得できますが、子プロセスの助けを借りずにそれを見つける方法はありますか?

ベストアンサー1

プロセスのPIDが与えられると、そのプロセスが属するすべてのPID名前空間に関する情報を取得できます。プロセス項目存在する/proc/PID/status

 NStgid                      descendant namespace thread group ID hierarchy

またはman proc:

NStgid:[pid]が属する名前空間のスレッドグループID(PIDなど)。左端の項目には相対項目が表示されます。プロセスのPID名前空間を読む、続いて連続してネストされた内部名前空間の値。 (Linux 4.1以降)

を使用する以外に、/procこの情報を検索する他の方法があるかどうかわかりません。


以下は、LXC-within-LXCコンテナ内で開始される休止プロセスの例です。したがって、最初のPID名前空間から読み取るとき、2つのネストされたPID(別名tgids)があります。

# pidof sleep
443701
# grep ^NStgid: /proc/443701/status 
NStgid: 443701  685 170

したがって、対応するPIDは中間ネームスペースで685、最終ネームスペースで170です。プロセスは自分のPID値が170であると見なします。

最後の項目は、プロセスが独自に表示される方法です。

親プロセスが最新のclone3(2)システムコールを使用せずに別のPID名前空間から子プロセスを作成する場合は、とにかく1つの追加のPID名前空間にのみ存在し、そのpidは次の行のエントリになります。 3番目と最後のエントリ(NStgid:最初に計算された)を記入)。これらのPIDネームスペースを入力して確認する場合(nsenter(1)または使用)、新しい仮想マウントネームスペースを作成(または使用)して、ここに再マウントする必要がありますsetns(2)。それ以外の場合、アイテムはまだ親PID名前空間の値を反映します。変化はないでしょう。unshare(1)unshare(2)clone(2)/proc/proc

追加の例は次のとおりです。これがsleepコマンドであることを確認してください。

# nsenter -t 443701 -p unshare -m --mount-proc ls -l /proc/170/exe   
lrwxrwxrwx 1 root root 0 Dec 21 23:03 /proc/170/exe -> /bin/sleep

中間PID名前空間にPID参照があります(中間LXCコンテナ名はストレッチ-AMD64)そこからどのように見えるかがわかります。

# lxc-info -Hp -n stretch-amd64
442977
# nsenter -t 442977 -p unshare -m --mount-proc grep ^NStgid: /proc/685/status
NStgid: 685 170

おすすめ記事