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 ?