Podrías hacer algo como:
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)
Comprueba el inodo del archivo que el /proc/*/task/*/ns/net
el enlace simbólico apunta a los de los archivos enlazados por ip netns add
en /run/netns
. Eso es básicamente lo que ip netns identify
o ip netns pid
en versiones más nuevas de iproute2
hacer.
Eso funciona con el kernel 3.13 a partir del linux-image-generic-lts-trusty
paquete en Ubuntu 12.04, pero no con el kernel 3.2 de la primera versión de 12.04 donde /proc/*/ns/*
no son enlaces simbólicos y cada net
el archivo allí de cada proceso y tarea obtiene un inodo diferente que no puede ayudar a determinar la membresía del espacio de nombres.
Ese compromiso agregó soporte para eso en 2011, lo que significa que necesita el kernel 3.8 o más reciente.
Con kernels más antiguos, podría intentar ejecutar un programa escuchando en un socket ABSTRACT en el espacio de nombres, y luego intentar ingresar el espacio de nombres de cada proceso para ver si puede conectarse a ese socket allí 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
La pregunta menciona específicamente Ubuntu 12.04, pero observo que en distribuciones más nuevas como 16.04 hay un comando que hace exactamente esto:ip netns pids <nsname>
ps $(ip netns pids myns)
donde myns
es su espacio de nombres