Vous pourriez faire quelque chose comme :
netns=myns
find -L /proc/[1-9]*/task/*/ns/net -samefile /run/netns/"$netns" | cut -d/ -f5
Ou avec zsh :
print -l /proc/[1-9]*/task/*/ns/net(e:'[ $REPLY -ef /run/netns/$netns ]'::h:h:t)
Il vérifie l'inode du fichier dont le /proc/*/task/*/ns/net le lien symbolique pointe vers ceux des fichiers montés en liaison par ip netns add en /run/netns . C'est essentiellement ce que ip netns identify ou ip netns pid dans les nouvelles versions de iproute2 faire.
Cela fonctionne avec le noyau 3.13 à partir du linux-image-generic-lts-trusty package sur Ubuntu 12.04, mais pas avec le noyau 3.2 de la première version de 12.04 où /proc/*/ns/* ne sont pas des liens symboliques et chaque net le fichier de chaque processus et tâche obtient un inode différent qui ne peut pas aider à déterminer l'appartenance à l'espace de noms.
La prise en charge de cela a été ajoutée par ce commit en 2011, ce qui signifie que vous avez besoin du noyau 3.8 ou plus récent.
Avec les noyaux plus anciens, vous pouvez essayer d'exécuter un programme écoutant sur une socket ABSTRACT dans l'espace de noms, puis essayer d'entrer l'espace de noms de chaque processus pour voir si vous pouvez vous connecter à cette socket comme :
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 question mentionne spécifiquement Ubuntu 12.04, mais je note que sur les distributions plus récentes comme 16.04, il existe une commande qui fait exactement cela :ip netns pids <nsname>
ps $(ip netns pids myns) où myns est votre espace de noms