Ubuntu 12.04を使用していますが、ip
ユーティリティにオプションがありませんip netns identify <pid>
。新しくインストールしようとしましたが、iproute
まだオプションがあります確認するうまくいかないようです!
ネットワークネームスペース内のすべてのプロセスを一覧表示するか、PIDを提供してプロセスが属するネットワークネームスペースを表示するスクリプト(またはコード)を作成するにはどうすればよいですか? (正しいことを確認するには、一部のプロセスに関する情報が必要ですnetns
。)
答え1
次のことができます。
netns=myns
find -L /proc/[1-9]*/task/*/ns/net -samefile /run/netns/"$netns" | cut -d/ -f5
または以下を使用してzsh
:
print -l /proc/[1-9]*/task/*/ns/net(e:'[ $REPLY -ef /run/netns/$netns ]'::h:h:t)
/proc/*/task/*/ns/net
バインドにマウントされたファイルのアノードに対してシンボリックリンクが指すファイルのアノードを確認します。基本的にそれがあるip netns add
/run/netns
ip netns identify
ip netns pid
新しいバージョンのiproute2
do。
これはlinux-image-generic-lts-trusty
Ubuntu 12.04パッケージの3.13カーネルでは機能しますが、12.04の最初のバージョンの3.2カーネルでは機能しません。ここでは/proc/*/ns/*
シンボリックリンクがなく、net
各プロセスとジョブの各ファイルが異なるinodeを取得するため、名前空間を決定するのに役立ちません。メンバー。
これは以下でサポートされます。その約束2011年にはカーネル3.8以上が必要だという意味です。
以前のカーネルでは、名前空間の抽象ソケットを受け取るプログラムを実行し、各プロセスの名前空間を入力して、次のようにソケットに接続できることを確認できます。
sudo ip netns exec "$netns" socat abstract-listen:test-ns,fork /dev/null &
ps -eopid= |
while read p; do
nsenter -n"/proc/$p/ns/net" socat -u abstract:test-ns - 2> /dev/null &&
echo "$p"
done
答え2
ps $(ip netns pids myns)
myns
あなたの名前空間はどこにありますか?
答え3
この質問にはUbuntu 12.04が具体的に言及されていますが、16.04などの最新のディストリビューションには次のコマンドがあることがわかりました。ip netns pids <nsname>
答え4
残念ながら、-samefileトリックは、外部ではなくコンテナ内で実行しても機能しないことがわかりました。同じインデックスノードなので理由がわかりません。とにかく、これは誰にとっても便利な場合に備えて実際に機能します。
netns=mynamespace
inode=$(ls -i /var/run/netns/$netns | cut -f1 -d" ")
pids=$(find -L /proc/[1-9]*/task/*/ns/net -inum $inode | cut -f3 -d"/" | uniq)
ps -p $pids