Potresti fare qualcosa del tipo:
netns=myns
find -L /proc/[1-9]*/task/*/ns/net -samefile /run/netns/"$netns" | cut -d/ -f5
O con zsh
:
print -l /proc/[1-9]*/task/*/ns/net(e:'[ $REPLY -ef /run/netns/$netns ]'::h:h:t)
Controlla l'inode del file che è il /proc/*/task/*/ns/net
Il collegamento simbolico punta nuovamente a quelli dei file montati tramite bind da ip netns add
in /run/netns
. Questo è fondamentalmente ciò che ip netns identify
o ip netns pid
nelle versioni più recenti di iproute2
fare.
Funziona con il kernel 3.13 a partire dal linux-image-generic-lts-trusty
pacchetto su Ubuntu 12.04, ma non con il kernel 3.2 dalla prima versione di 12.04 dove /proc/*/ns/*
non sono collegamenti simbolici e ogni net
file lì da ogni processo e attività ottiene un inode diverso che non può aiutare a determinare l'appartenenza allo spazio dei nomi.
Il supporto per questo è stato aggiunto da quel commit nel 2011, il che significa che hai bisogno del kernel 3.8 o più recente.
Con i kernel più vecchi, potresti provare ad eseguire un programma in ascolto su un socket ABSTRACT nello spazio dei nomi, quindi provare a inserire lo spazio dei nomi di ogni processo per vedere se riesci a connetterti a quel socket lì come:
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
La domanda menziona specificamente Ubuntu 12.04, ma noto che nelle distribuzioni più recenti come la 16.04 esiste un comando che fa esattamente questo:ip netns pids <nsname>
ps $(ip netns pids myns)
dove myns
è il tuo spazio dei nomi