web-dev-qa-db-ja.com

ネットワーク名前空間に属するプロセスを一覧表示する

私はUbuntu 12.04を使用していますが、ipユーティリティにip netns identify <pid>オプションがありません。新しいiprouteをインストールしようとしましたが、オプションidentifyはあります動作していないようです!。

スクリプト(またはコード)を記述してネットワーク名前空間内のすべてのプロセスを一覧表示する場合、またはPIDを指定した場合、それがどのネットワーク名前空間に属しているかを表示するには、どうすればよいですか? (プロセスが正しいかどうかを確認するには、いくつかのプロセスに関する情報が必要ですnetns

7
vyom

あなたは次のようなことをすることができます:

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/netip netns addによってバインドマウントされたファイルの/run/netnsシンボリックリンクが指すファイルのiノードをチェックします。これは基本的にip netns identifyの新しいバージョンのip netns pidまたは iproute2 が行うことです。

これは、Ubuntu 12.04のlinux-image-generic-lts-trustyパッケージからのように、3.13カーネルでは機能しますが、/proc/*/ns/*がシンボリックリンクではなく、各netファイルがある12.04の最初のリリースからの3.2カーネルでは機能しませんすべてのプロセスとタスクから、異なるiノードを取得しますが、ネームスペースメンバーシップの決定には役立ちません。

そのサポートは2011年に that commit によって追加されました。つまり、カーネル3.8以降が必要です。

古いカーネルでは、名前空間のABSTRACTソケットをリッスンするプログラムを実行してから、すべてのプロセスの名前空間を入力して、そのソケットに接続できるかどうかを確認できます。

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
15

質問は特にUbuntu 12.04について言及していますが、16.04のような新しいディストリビューションでは、これを正確に実行するコマンドがあることに注意します:ip netns pids <nsname>

3
squashed

ps $(ip netns pids myns)mynsは名前空間です

2
L S

Namespace-Lister:

listns.pyは次のように使用できます:./listns.pyまたはpython2 listns.pyソース: github-mirror および article;すべてのクレジット ラルフ・トレゼシアック

IP-Netns

以下で実行できます($ namespace-nameを置き換えます):

ip netns pids $namespace-name | xargs ps -o pid,command -p

Nsutils

すべてのネット名前空間と各名前空間で実行されているすべてのプロセスをリストするnetnslistを提供します。

1
intika

コンテナーの外側ではなく内側で実行すると、悲しいことに-samefileのトリックが機能しませんでした。それが同じiノードだったので、なぜかわかりません。とにかく、これはうまくいきました、誰かに役立つ場合に備えて:

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
0
Neil McGill