私はUbuntu 12.04を使用していますが、ip
ユーティリティにip netns identify <pid>
オプションがありません。新しいiproute
をインストールしようとしましたが、オプションidentifyはあります動作していないようです!。
スクリプト(またはコード)を記述してネットワーク名前空間内のすべてのプロセスを一覧表示する場合、またはPIDを指定した場合、それがどのネットワーク名前空間に属しているかを表示するには、どうすればよいですか? (プロセスが正しいかどうかを確認するには、いくつかのプロセスに関する情報が必要ですnetns
)
あなたは次のようなことをすることができます:
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
シンボリックリンクが指すファイルの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
質問は特にUbuntu 12.04について言及していますが、16.04のような新しいディストリビューションでは、これを正確に実行するコマンドがあることに注意します:ip netns pids <nsname>
ps $(ip netns pids myns)
myns
は名前空間です
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
すべてのネット名前空間と各名前空間で実行されているすべてのプロセスをリストするnetnslist
を提供します。
コンテナーの外側ではなく内側で実行すると、悲しいことに-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