Belirli bir sürecin ad alanını nasıl bulabilirim?


Yanıtlar:


39

Hem bunu hem de daha önceki sorunuzla ilgili olduklarını cevaplamaya çalışacağım .

Ad alanlarına kapılar dosyalardır /proc/*/ns/*ve /proc/*/task/*/ns/*.

Bir ad alanı, ad alanını paylaşmayan bir işlem tarafından oluşturulur . Bir ad o zamana kadar kalıcı hale getirilebilir bağlama montajns başka yere dosyayı.

Bu ne ip netnsiçin örneğin yapar net ad. Onun unshares netad ve bağlama-bağlar /proc/self/ns/netiçin ./run/netns/netns-name

Bir de /prockök pid ad monte, aşağıdakileri yaparak onları bir süreç var tüm ad alanlarını listeleyebilirsiniz:

# readlink /proc/*/task/*/ns/* | sort -u
ipc:[4026531839]
mnt:[4026531840]
mnt:[4026531856]
mnt:[4026532469]
net:[4026531956]
net:[4026532375]
pid:[4026531836]
pid:[4026532373]
uts:[4026531838]

Köşeli parantez içindeki sayı inode numarasıdır.

Bunu belirli bir işlem için elde etmek için:

# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid

Şimdi, içinde herhangi bir işlem bulunmayan kalıcı ad alanları olabilir . Onları bulmak çok daha zor AFAICT olabilir.

İlk önce, birkaç mount ad alanı olabileceğini aklınızda bulundurmanız gerekir .

# awk '$9 == "proc" {print FILENAME,$0}' /proc/*/task/*/mountinfo | sort -k2 -u
/proc/1070/task/1070/mountinfo 15 19 0:3 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
/proc/19877/task/19877/mountinfo 50 49 0:3 / /run/netns/a rw,nosuid,nodev,noexec,relatime shared:2 - proc proc rw
/proc/19877/task/19877/mountinfo 57 40 0:3 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
/proc/1070/task/1070/mountinfo 66 39 0:3 / /run/netns/a rw,nosuid,nodev,noexec,relatime shared:2 - proc proc rw
/proc/19877/task/19877/mountinfo 68 67 0:3 / /mnt/1/a rw,nosuid,nodev,noexec,relatime unbindable - proc proc rw

Bunlar /mnt/1/a, /run/netns/aisim alanı dosyaları olabilir.

Bir inode numarası alabiliriz:

# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a

Ancak bu bize yukarıda hesaplanan listede bulunmadığından başka bir şey söylemez.

Farklı türlerden herhangi biri olarak girmeyi deneyebiliriz:

# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --pid=/mnt/1/a true
nsenter: reassociate to namespace 'ns/pid' failed: Invalid argument
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --mount=/mnt/1/a true
nsenter: reassociate to namespace 'ns/mnt' failed: Invalid argument
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --net=/mnt/1/a true
#

Tamam, o bir netad alanı dosyasıydı.

Bu nedenle, boşluk adlarını listelemek için bir yöntemimiz var gibi görünüyor: nstüm görevlerin dizinlerini listeledikten sonra tüm procmontaj noktalarını bulun /proc/*/task/*/mountinfove girmeye çalışarak türlerini belirleyin.


19

Eğer varsa util-linux v2.28 ve üzeri kullanabilirsiniz LSN :

# lsns
        NS TYPE  NPROCS   PID USER             COMMAND
4026531836 pid       78     1 root             /sbin/init
4026531837 user      79     1 root             /sbin/init
4026531838 uts       78     1 root             /sbin/init
4026531839 ipc       78     1 root             /sbin/init
4026531840 mnt       75     1 root             /sbin/init
4026531857 mnt        1    12 root             kdevtmpfs
4026531957 net       79     1 root             /sbin/init
4026532393 mnt        1  1214 root             /lib/systemd/systemd-udevd
4026532415 mnt        1  2930 systemd-timesync /lib/systemd/systemd-timesyncd
4026532477 mnt        1 32596 root             -bash
4026532478 uts        1 32596 root             -bash
4026532479 ipc        1 32596 root             -bash
4026532480 pid        1 32596 root             -bash

Düzeltme: İnsns, v2.27 util-linux'da bu cevabın söylediği gibi kullanılamaz. Bakınız https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes


Eski linux'dakiler için bulduğum güzel bir python betiği de var. opencloudblog.com/?p=251
Neil McGill

lsnsçok kullanışlıdır, ancak her ad alanındaki yalnızca en düşük PID değerini gösterir - yani herhangi bir isteğe bağlı PID için ad alanını söyleyemez. Yine de + 1 çünkü soruyu doğrudan cevaplamamış olsa bile bu hala faydalı bir cevap.
cas,

9
$ ip netns identify $PID

$PIDÇeşitli şekillerde alabileceğiniz işlemin işlem kimliği nerede ?

http://man7.org/linux/man-pages/man8/ip-netns.8.html


1
Bunun yalnızca ağ ad alanları için ve yalnızca kullanılarak oluşturulanların ip netns(veya en azından / run / netns'teki ad alanı kapılarını bağlayan bir şey tarafından oluşturulduğunu unutmayın ip netns) unutmayın. Temelde aynı olan dosyaları / run / netns içinde arar /proc/$PID/ns/net.
Stéphane Chazelas,

Ne? /run/netnsbilgisayarımda bile yok.
Ken Sharp,

/run/netnsveya ipad alanı özel dosyalarını bağlayan her yerde . findmnt -t nsfssisteminizde nerede olduğunu söyleyebilir. OTOH, yaparsan unshare -n sleep 1000 & ip netns identify "$!"hiçbir şey elde edemezsin.
Stéphane Chazelas

findmnt -t nsfs- hiçbir şey değil. unshare -n sleep 1000 & ip netns identify "$!"- paylaşma: paylaşma başarısız oldu: İşleme izin verilmiyor
Ken Sharp

Yeni bir ağ oluşturmak için süper kullanıcı ayrıcalıklarına (CAP_SYS_ADMIN özelliği) ihtiyacınız var. findmnt -t nsfshiçbir şey iadesi, makinenizin ATM'lerinde ağ bulunmadığını gösterir.
Stéphane Chazelas

9

psŞimdi süreçlerle ilişkili ad farklı türleri için çıkış seçenekleri vardır: ipcns, mntns, netns, pidns, userns, ve utsns. Bu soru için, ilgili olan PID ad alanıdır veya pidns.

öyleyse, örneğin, pid 459 için PID ad alanı kimliğini bulmak istiyorsanız:

# ps -h -o pidns -p 459
4026532661

ve bu ad alanındaki tüm işlemleri listelemek için:

ps -o pidns,pid,cmd | awk '$1==4026532661'

veya pgrepdoğrudan, bir PID'den aynı PID ad alanını paylaşan tüm işlemlerin listesine gidebilirsiniz:

pgrep -a --ns 459

Aksine ps, pgrepçıktıyı belirli bir ad alanıyla sınırlandırabilir (içindeki işlemlerden birinin PID'sini biliyorsanız), ancak çok sınırlı çıktı biçimlendirme özelliği vardır (yalnızca PID'ler veya PID'ler ve komut satırları).

İstediğiniz zaman boru çıkışı pgrep --ns 459için xargs ps -fsüreç hakkında gereken bilgileri almak için bile.


0

Ad alanı-Lister :

Listns.py kullanabilirsiniz

Kullanımı: ./listns.pyveya python2 listns.pyTam olarak bu soruyu yanıtlamak için, sonucu bu şekilde elde edebilirsinizpython2 listns.py | grep $PID (pid değişkeni değiştirin)

Kaynak: github-ayna ve makale tüm kredi Ralf Trezeciak

Ağ ad alanları :

Ağ ad alanı ip netns identify $PIDiçin kullanılabilir.

Nsutils

pidnslistBir işlemin pid ad alanını döndürmesini sağlayın

$ pidnslist -ss 8782
pid:[4026531836] 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.