有什么方法可以找到 Linux 中存在多少个每种类型的活动命名空间?例如:
- 安装 NS:20
- 净NS:40
- ETC。
答案1
这将迭代下面的链接/proc/*/ns
以计算每种类型的活动命名空间的数量,IE包含至少一个进程的命名空间:
sudo find /proc/*/ns -type l -printf "%l\n" |
gawk -F'[:\\[\\]]+' '{ nss[$1][$2] = 1 } END { for (ns in nss) { print ns ": " length(nss[ns]) } }'
它的工作原理是计算不同标识符的数量,并按命名空间类型分组。
通过将命名空间绑定挂载到其他地方,可以在没有进程的情况下保持命名空间的活动;上述没有考虑到这一点。
答案2
您可以使用lsns(1)
util-linux 包中的命令来实现此目的 [1]:
lsns -n | awk '{n[$2]++}END{for(k in n) print k"\t"n[k]}'
net 2
cgroup 1
...
但lsns
已经坏了:它不会显示每个线程的命名空间或仅通过打开句柄或绑定安装保持活动的命名空间。要获得所有这些,请尝试lsnsx.pl
我的另一个脚本回答:
# perl ./lsnsx.pl | grep -v '^ '
cgroup 1
ipc 1
mnt 3
net 5
...
[1] 如果您使用的计算机没有lsns
(例如 busybox),您可以直接从以下位置提取该信息/proc/*/ns/*
:
for f in /proc/[0-9]*/ns/*; do readlink "$f"; done | awk -F: '!t[$2]++{c[$1]++}END{for(k in c)print k"\t"c[k]}'
您可以更改/proc/[0-9]*/ns
为/proc/[0-9]*/task/[0-9]*/ns
也获取每线程名称空间,但在任何适度使用的计算机上,它会变得非常慢。