Anda dapat melakukan sesuatu seperti:
netns=myns
find -L /proc/[1-9]*/task/*/ns/net -samefile /run/netns/"$netns" | cut -d/ -f5
Atau dengan zsh :
print -l /proc/[1-9]*/task/*/ns/net(e:'[ $REPLY -ef /run/netns/$netns ]'::h:h:t)
Itu memeriksa inode dari file yang /proc/*/task/*/ns/net symlink menunjuk ke file-file yang di-mount-bind oleh ip netns add di /run/netns . Pada dasarnya itulah ip netns identify atau ip netns pid di versi iproute2 yang lebih baru lakukan.
Itu berfungsi dengan kernel 3.13 mulai dari linux-image-generic-lts-trusty paket di Ubuntu 12.04, tetapi tidak dengan kernel 3.2 dari rilis pertama 12.04 di mana /proc/*/ns/* bukan symlink dan masing-masing net file di sana dari setiap proses dan tugas mendapatkan inode berbeda yang tidak dapat membantu menentukan keanggotaan namespace.
Dukungan untuk itu ditambahkan oleh komit tersebut pada tahun 2011, yang berarti Anda memerlukan kernel 3.8 atau yang lebih baru.
Dengan kernel yang lebih lama, Anda dapat mencoba dan menjalankan program mendengarkan pada soket ABSTRACT di namespace, lalu mencoba memasukkan namespace setiap proses untuk melihat apakah Anda dapat terhubung ke soket tersebut di sana seperti:
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
Pertanyaannya secara khusus menyebutkan Ubuntu 12.04, tetapi saya perhatikan bahwa pada distro yang lebih baru seperti 16.04 ada perintah yang melakukan hal ini:ip netns pids <nsname>
ps $(ip netns pids myns) di mana myns adalah ruang nama Anda