別の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
答え2
プロセスには複数のサブプロセスがあります。子プロセスのPIDを取得する最善の方法は、子プロセスが作成されたときに取得することです。どちらも成功したfork
場合は子PIDを返しますclone
。