Você pode fazer algo como:
netns=myns
find -L /proc/[1-9]*/task/*/ns/net -samefile /run/netns/"$netns" | cut -d/ -f5
Ou com zsh
:
print -l /proc/[1-9]*/task/*/ns/net(e:'[ $REPLY -ef /run/netns/$netns ]'::h:h:t)
Ele verifica o inode do arquivo para o qual o link simbólico /proc/*/task/*/ns/net
aponta para os arquivos montados por ip netns add
in /run/netns
. Isso é basicamente o que ip netns identify
ou ip netns pid
nas versões mais recentes de iproute2
do.
Isso funciona com o kernel 3.13 a partir do pacote linux-image-generic-lts-trusty
no Ubuntu 12.04, mas não com o kernel 3.2 da primeira versão do 12.04, onde /proc/*/ns/*
não são symlinks e cada net
de cada processo e tarefa recebe um inode diferente que não pode ajudar a determinar a associação ao namespace.
O suporte para isso foi adicionado por que se compromete em 2011, o que significa que você precisa do kernel 3.8 ou mais recente.
Com kernels mais antigos, você poderia tentar executar um programa escutando em um soquete ABSTRACT no namespace, e então tentar entrar no namespace de cada processo para ver se você pode se conectar a esse socket lá como:
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