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