ネットワークネームスペースに属するプロセスを一覧表示するには?

ネットワークネームスペースに属するプロセスを一覧表示するには?

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/netnsip netns identifyip netns pid新しいバージョンのiproute2do。

これはlinux-image-generic-lts-trustyUbuntu 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

関連情報