ホスト pid またはコンテナー pid のいずれかがわかっている場合は、次のようにホスト上のすべての NSpid マップを検索して見つけることができます:
# grep NSpid.*10061 /proc/*/status 2> /dev/null
/proc/1194200/status:NSpid: 1194200 10061
- 1194200 はホスト pid です
- 10061 はコンテナの pid です
2>/dev/null は、次のような grep エラーを引き起こす短命のプロセスを無視することです:grep:/proc/1588467/status:No such file or directory
/proc/<pid>/status
を見ることができます ファイルを使用して、名前空間 PID とグローバル PID の間のマッピングを決定します。たとえば、docker コンテナーで複数の sleep 900
を開始した場合 次のようなプロセス:
# docker run --rm -it alpine sh
/ # sleep 900 &
/ # sleep 900 &
/ # sleep 900 &
コンテナー内で実行されていることがわかります:
/ # ps -fe
PID USER TIME COMMAND
1 root 0:00 sh
7 root 0:00 sleep 900
8 root 0:00 sleep 900
9 root 0:00 sleep 900
10 root 0:00 ps -fe
ホストでこれらを確認できます:
# ps -fe | grep sleep
root 10394 10366 0 09:11 pts/10 00:00:00 sleep 900
root 10397 10366 0 09:12 pts/10 00:00:00 sleep 900
root 10398 10366 0 09:12 pts/10 00:00:00 sleep 900
そして、それらのいずれについても、status
を見ることができます。 名前空間 pid を確認するためのファイル:
# grep -i pid /proc/10394/status
Pid: 10394
PPid: 10366
TracerPid: 0
NSpid: 10394 7
NSpid
を見ると 行、PID 名前空間内でこのプロセスが pid 7 であることを確認できます。実際、プロセス 10394
を強制終了すると、 ホスト上:
# kill 10394
その後、コンテナで PID 7 が実行されていないことがわかります:
/ # ps -fe
PID USER TIME COMMAND
1 root 0:00 sh
8 root 0:00 sleep 900
9 root 0:00 sleep 900
11 root 0:00 ps -fe