我已经问过一个有关如何在Linux中列出所有名称空间的问题,但是没有任何正确而准确的答案,因此我想找到一种方法,可以帮助我找出某个进程或一组PID的名称空间。流程。如何在Linux中完成?
我已经问过一个有关如何在Linux中列出所有名称空间的问题,但是没有任何正确而准确的答案,因此我想找到一种方法,可以帮助我找出某个进程或一组PID的名称空间。流程。如何在Linux中完成?
Answers:
命名空间的门是/proc/*/ns/*
和中的文件/proc/*/task/*/ns/*
。
命名空间是由进程取消共享其命名空间而创建的。命名空间然后可通过永久绑定安装的ns
文件到其他地方。
ip netns
例如,这就是网络名称空间。它取消共享其net
名称空间并绑定/proc/self/ns/net
到。/run/netns/netns-name
在/proc
根pid命名空间的已挂载中,您可以通过执行以下操作列出其中包含进程的所有命名空间:
# readlink /proc/*/task/*/ns/* | sort -u
ipc:[4026531839]
mnt:[4026531840]
mnt:[4026531856]
mnt:[4026532469]
net:[4026531956]
net:[4026532375]
pid:[4026531836]
pid:[4026532373]
uts:[4026531838]
方括号中的数字是索引节点号。
要获得给定流程的信息:
# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid
现在,可能有永久的名称空间,其中没有任何进程。找出它们可能要困难得多。
首先,您必须记住,可以有多个安装名称空间。
# 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
这些/mnt/1/a
,/run/netns/a
可能会命名文件。
我们可以得到一个索引节点号:
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a
但这并没有告诉我们很多,除了上面计算出的列表之外。
我们可以尝试将其输入为以下任何一种类型:
# 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
#
好的,那是一个net
命名空间文件。
因此,似乎我们有一种列出名称空间的方法:列出ns
所有任务的目录,然后在所有目录中找到所有安装proc
点,/proc/*/task/*/mountinfo
并通过尝试输入它们来找出它们的类型。
如果您具有util-linux v2.28或更高版本,则可以使用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
更正:lsns在util-linux v2.27中不可用,因为这个答案曾经说过。参见https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes
lsns
是非常有用的,但是它只显示每个命名空间中最低的PID-即,它不能告诉您任何任意PID的命名空间。还是要+1,因为即使它不能直接回答问题,这仍然是一个有用的答案。
$ ip netns identify $PID
$PID
流程的流程ID 在哪里,您可以通过各种方式获取。
ip netns
(或至少由将名称空间门绑定安装在/ run / netns中的东西创建的名称名称ip netns
)。它基本上在/ run / netns中查找与相同的文件 /proc/$PID/ns/net
。
/run/netns
在我的计算机上甚至都不存在。
/run/netns
或ip
绑定绑定名称空间特殊文件的任何位置。findmnt -t nsfs
可能会告诉您它在系统上的位置。OTOH,如果您这样做unshare -n sleep 1000 & ip netns identify "$!"
,您将一无所获。
findmnt -t nsfs
- 没有。unshare -n sleep 1000 & ip netns identify "$!"
-取消共享:取消共享失败:不允许操作
findmnt -t nsfs
不返回任何信息表示您的计算机ATM上没有任何netnet。
ps
现在具有用于与过程相关联的不同类型的命名空间的输出选择:ipcns
,mntns
,netns
,pidns
,userns
,和utsns
。对于这个问题,相关的是PID名称空间或pidns
。
因此,如果您想找出PID命名空间ID,例如pid 459:
# ps -h -o pidns -p 459
4026532661
并列出该命名空间中的所有进程:
ps -o pidns,pid,cmd | awk '$1==4026532661'
或使用pgrep
,您可以直接从PID转到共享相同PID名称空间的所有进程的列表:
pgrep -a --ns 459
与不同ps
,pgrep
可以将输出限制为特定的名称空间(如果您知道其中一个进程的PID),但是输出格式功能非常有限(仅PID或PID及其命令行)
您始终可以通过管道将的输出pgrep --ns 459
传递到,xargs ps -f
以检索有关该过程所需的信息。
您可以使用listns.py
用法:./listns.py
或python2 listns.py
为精确回答这个问题,您可以像这样grep结果python2 listns.py | grep $PID
(替换pid变量)
来源:github-mirror和文章 全部归功于Ralf Trezeciak
对于网络名称空间,ip netns identify $PID
可以使用。
提供pidnslist
返回流程的pid名称空间
$ pidnslist -ss 8782
pid:[4026531836]