Sie könnten so etwas tun:
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, die /proc/*/task/*/ns/net
Symlink zeigt auf die der Dateien, die durch ip netns add
eingebunden wurden in /run/netns
. Das ist im Grunde was ip netns identify
oder ip netns pid
in neueren Versionen von iproute2
tun.
Das funktioniert mit dem 3.13 Kernel ab dem linux-image-generic-lts-trusty
Paket auf Ubuntu 12.04, aber nicht mit dem 3.2-Kernel aus der ersten Version von 12.04, wo /proc/*/ns/*
sind keine Symlinks und jeweils net
Datei dort von jedem Prozess und jeder Aufgabe erhält einen anderen Inode, der nicht helfen kann, die Namespace-Mitgliedschaft zu bestimmen.
Die Unterstützung dafür wurde 2011 durch diesen Commit hinzugefügt, was bedeutet, dass Sie Kernel 3.8 oder neuer benötigen.
Bei älteren Kerneln könnten Sie versuchen, ein Programm auszuführen, das auf einem ABSTRACT-Socket im Namensraum lauscht, und dann versuchen, den Namensraum jedes Prozesses einzugeben, um zu sehen, 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
Die Frage erwähnt ausdrücklich Ubuntu 12.04, aber ich stelle fest, dass es auf neueren Distributionen wie 16.04 einen Befehl gibt, der genau dies tut:ip netns pids <nsname>
ps $(ip netns pids myns)
wobei myns
ist Ihr Namespace