Làm thế nào để tìm ra không gian tên của một quá trình cụ thể?


25

Tôi đã hỏi một câu hỏi về cách liệt kê tất cả các không gian tên trong Linux , nhưng không có câu trả lời chính xác và chính xác, vì vậy tôi muốn tìm ra một phương pháp có thể giúp tôi tìm ra không gian tên của PID của một số quy trình hoặc nhóm các quy trình. Làm thế nào nó có thể được thực hiện trong Linux?

Câu trả lời:


39

Tôi sẽ thử và trả lời cả câu hỏi này và câu hỏi trước đó của bạn vì chúng có liên quan.

Các cửa vào không gian tên là các tập tin trong /proc/*/ns/*/proc/*/task/*/ns/*.

Một không gian tên được tạo bởi một quá trình không chia sẻ không gian tên của nó. Một namespace sau đó có thể được thực hiện thường xuyên bởi ràng buộc tháo lắp các nstập tin vào một số nơi khác.

Đó là những gì ip netnslàm ví dụ cho không gian tên mạng . Nó netkhông hiển thị không gian tên của nó và liên kết gắn kết /proc/self/ns/netvới ./run/netns/netns-name

Trong một /prockhông gian tên gốc được gắn kết, bạn có thể liệt kê tất cả các không gian tên có một quy trình trong đó bằng cách thực hiện:

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

Số trong ngoặc vuông là số inode.

Để có được điều đó cho một quy trình nhất định:

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

Bây giờ, có thể có các không gian tên vĩnh viễn không có bất kỳ quy trình nào trong đó. Tìm ra chúng có thể khó khăn hơn rất nhiều AFAICT.

Đầu tiên, bạn phải nhớ rằng có thể có một vài không gian tên mount .

# 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

Những /mnt/1/a, /run/netns/acó thể file namespace.

Chúng ta có thể nhận được một số inode:

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

Nhưng điều đó không cho chúng ta biết nhiều hơn là nó không có trong danh sách được tính toán ở trên.

Chúng tôi có thể thử và nhập nó dưới dạng bất kỳ loại nào khác nhau:

# 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
#

OK, đó là một nettập tin không gian tên.

Vì vậy, dường như chúng ta có một phương pháp để liệt kê các không gian tên: liệt kê các nsthư mục của tất cả các tác vụ, sau đó tìm tất cả các procđiểm gắn kết trong tất cả /proc/*/task/*/mountinfovà tìm ra loại của chúng bằng cách cố gắng nhập chúng.


19

Nếu bạn có tiện ích linux v2.28 trở lên, bạn có thể sử dụng lsns :

# 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

Sửa chữa: lsns không có sẵn trong produc-linux v2.27 như câu trả lời này được sử dụng để nói. Xem https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes


Ngoài ra còn có một kịch bản python đẹp mà tôi tìm thấy, cho những người dùng trên linux cũ. opencloudblog.com/?p=251
Neil McGill

lsnslà rất hữu ích nhưng nó chỉ hiển thị PID thấp nhất trong mỗi không gian tên - tức là nó không thể cho bạn biết không gian tên cho bất kỳ PID tùy ý nào. Dù sao +1 vì đây vẫn là một câu trả lời hữu ích ngay cả khi nó không trả lời trực tiếp câu hỏi.
cas

9
$ ip netns identify $PID

nơi $PIDlà quá trình ID của quá trình mà bạn có thể nhận được trong nhiều cách khác nhau.

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


1
Lưu ý rằng nó chỉ dành cho các không gian tên mạng và chỉ những không gian được tạo bằng cách sử dụng ip netns(hoặc ít nhất là được tạo bởi thứ gì đó gắn kết các cửa không gian tên trong / run / netns như thế ip netns). Về cơ bản, nó tìm trong / run / netns cho các tệp giống như /proc/$PID/ns/net.
Stéphane Chazelas

Gì? /run/netnsthậm chí không tồn tại trên máy tính của tôi.
Ken Sharp

/run/netnshoặc bất cứ nơi nào ipliên kết gắn kết các tập tin đặc biệt không gian tên. findmnt -t nsfscó thể cho bạn biết nó ở đâu trên hệ thống của bạn. OTOH, nếu bạn làm thế unshare -n sleep 1000 & ip netns identify "$!", bạn sẽ không nhận được gì.
Stéphane Chazelas

findmnt -t nsfs- không có gì. unshare -n sleep 1000 & ip netns identify "$!"- unshare: unshare fail: Thao tác không được phép
Ken Sharp

Bạn cần các đặc quyền siêu người dùng (khả năng CAP_SYS_ADMIN) để tạo một mạng mới. findmnt -t nsfstrả lại không có gì gợi ý rằng bạn không có bất kỳ mạng nào trên máy ATM của bạn.
Stéphane Chazelas

9

pshiện nay có các tùy chọn đầu ra cho các loại khác nhau của không gian tên gắn liền với quá trình: ipcns, mntns, netns, pidns, userns, và utsns. Đối với câu hỏi này, câu hỏi liên quan là không gian tên PID, hoặc pidns.

vì vậy nếu bạn muốn tìm id id không gian tên cho, ví dụ: pid 459:

# ps -h -o pidns -p 459
4026532661

và để liệt kê tất cả các quy trình trong không gian tên đó:

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

hoặc với pgrep, bạn có thể chuyển trực tiếp từ một danh sách tới tất cả các quy trình chia sẻ cùng một không gian tên PID đó:

pgrep -a --ns 459

Không giống như ps, pgrepcó thể giới hạn đầu ra ở một không gian tên cụ thể (nếu bạn biết PID của một trong các quy trình trong đó), nhưng có khả năng định dạng đầu ra rất hạn chế (chỉ PID, hoặc PID và dòng lệnh của chúng)

Bạn luôn có thể đường ống đầu ra của pgrep --ns 459để xargs ps -fdù để lấy các thông tin cần thiết về quá trình này.


0

Không gian tên-Lister :

Bạn có thể sử dụng listns.py

Cách sử dụng: ./listns.pyhoặc python2 listns.pyĐể trả lời chính xác câu hỏi này, bạn có thể grep kết quả như thế này python2 listns.py | grep $PID(thay thế biến pid)

Nguồn: github-mirrorbài viết tất cả tín dụng cho Ralf Trezeciak

Không gian tên mạng :

Đối với không gian tên mạng, ip netns identify $PIDcó thể được sử dụng.

Nsutils

Cung cấp pidnslisttrả về không gian tên pid của một tiến trình

$ pidnslist -ss 8782
pid:[4026531836] 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.