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