Sie könnten so etwas tun wie:
netns=myns
find -L /proc/[1-9]*/task/*/ns/net -samefile /run/netns/"$netns" | cut -d/ -f5
Oder mit zsh
:
print -l /proc/[1-9]*/task/*/ns/net(e:'[ $REPLY -ef /run/netns/$netns ]'::h:h:t)
Es überprüft den Inode der Datei, auf die der /proc/*/task/*/ns/net
Symlink verweist, mit denen der Dateien, die von ip netns add
in bindmounted gemountet wurden /run/netns
. Das ist im Grunde was ip netns identify
oder ip netns pid
in neueren Versionen von iproute2
do.
Das funktioniert mit dem 3.13-Kernel wie aus dem linux-image-generic-lts-trusty
Paket unter Ubuntu 12.04, aber nicht mit dem 3.2-Kernel aus der ersten Version von 12.04, wo /proc/*/ns/*
es keine Symlinks gibt und jede net
Datei dort von jedem Prozess und jeder Aufgabe einen anderen Inode erhält, der nicht helfen kann, den Namespace zu bestimmen Mitgliedschaft.
Die Unterstützung dafür wurde durch dieses Commit im Jahr 2011 hinzugefügt , was bedeutet, dass Sie Kernel 3.8 oder neuer benötigen.
Bei älteren Kerneln können Sie versuchen, ein Programm auszuführen, das einen ABSTRACT-Socket im Namespace abhört, und dann versuchen, den Namespace jedes Prozesses einzugeben, um festzustellen, ob Sie dort eine Verbindung zu diesem Socket herstellen können, wie:
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
bash
), aber beim Ausführen wird eine Fehlermeldung angezeigtfind -L /proc/*/task/*/ns/net -samefile /run/netns/"$netns" find: '/proc/self/task/8964/ns/net': No such file or directory
(wo8964
befindet sich die aktuelle pid [$$
]) - sollte ich dies imdefault
Namespace ausführen ?/
und ich habe dasnetns
auf die übliche Weise erstellt -ip netns add
und ich kann es sehen/var/run/netns/
. Ich bin mir nicht sicher, was ich vermissegrep /run/netns /proc/self/mountinfo
meldet etwas? Welche Kernel-Version verwenden Sie (uname -rs
)?ip netns help
listet den Befehl auf,netns pids NAME
der, wie ich denke, alle Pids in einem Namen netns auflisten soll.In der Frage wird speziell Ubuntu 12.04 erwähnt, aber ich stelle fest, dass es in neueren Distributionen wie 16.04 einen Befehl gibt, der genau dies tut:
ip netns pids <nsname>
quelle
ip netns
nur auf Netzwerk-Namespaces, die/run/netns
(auch/var/run/netns
) gebunden sind . Es ist völlig unwissend gegenüber anderen Netzwerk-Namespaces, die entweder an anderen Stellen gebunden sind, wie z. B./run/docker
, und es ist insbesondere völlig unwissend/proc
.ps $(ip netns pids myns)
Womyns
ist dein Namespace?quelle
Namespace-Lister:
Sie können listns.py verwenden mit:
./listns.py
oderpython2 listns.py
( Quelle: Github-Mirror und Artikel ; alle Dank an Ralf Trezeciak )IP-Netns :
Kann mit folgendem durchgeführt werden (ersetzen Sie $ namespace-name):
Nsutils
Stellen Sie
netnslist
diese Liste aller Netz-Namespaces und aller Prozesse bereit, die in jedem Namespace ausgeführt werden:quelle
Als ich innerhalb des Containers und nicht außerhalb lief, stellte ich fest, dass der Trick mit der gleichen Datei leider nicht funktionierte. Ich bin mir nicht sicher warum, da es das gleiche Inode war. Auf jeden Fall hat dies jedoch funktioniert, nur für den Fall, dass es für irgendjemanden von Nutzen ist:
quelle