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/netSymlink verweist, mit denen der Dateien, die von ip netns addin bindmounted gemountet wurden /run/netns. Das ist im Grunde was ip netns identifyoder ip netns pidin neueren Versionen von iproute2do.
Das funktioniert mit dem 3.13-Kernel wie aus dem linux-image-generic-lts-trustyPaket 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 netDatei 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(wo8964befindet sich die aktuelle pid [$$]) - sollte ich dies imdefaultNamespace ausführen ?