Můžete udělat něco jako:
netns=myns
find -L /proc/[1-9]*/task/*/ns/net -samefile /run/netns/"$netns" | cut -d/ -f5
Nebo pomocí zsh
:
print -l /proc/[1-9]*/task/*/ns/net(e:'[ $REPLY -ef /run/netns/$netns ]'::h:h:t)
Zkontroluje inode souboru, který má /proc/*/task/*/ns/net
symbolický odkaz ukazuje na proti těm souborům připojeným pomocí ip netns add
v /run/netns
. To je v podstatě to, co ip netns identify
nebo ip netns pid
v novějších verzích iproute2
udělat.
To funguje s jádrem 3.13 od linux-image-generic-lts-trusty
balíček na Ubuntu 12.04, ale ne s jádrem 3.2 z prvního vydání 12.04, kde /proc/*/ns/*
nejsou symbolické odkazy a každý net
soubor z každého procesu a úlohy získá jiný inode, který nemůže pomoci určit příslušnost k jmennému prostoru.
Podpora pro to byla přidána tímto odevzdáním v roce 2011, což znamená, že potřebujete jádro 3.8 nebo novější.
Se staršími jádry můžete zkusit spustit program naslouchající na soketu ABSTRACT ve jmenném prostoru a pak zkusit zadat jmenný prostor každého procesu, abyste zjistili, zda se tam můžete připojit k tomuto soketu, jako:
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
Otázka konkrétně zmiňuje Ubuntu 12.04, ale podotýkám, že na novějších distribucích, jako je 16.04, existuje příkaz, který dělá přesně toto:ip netns pids <nsname>
ps $(ip netns pids myns)
kde myns
je váš jmenný prostor