vyo*_*yom 9 linux process network-namespaces
我在 Ubuntu 12.04 上,该ip实用程序没有ip netns identify <pid>选项,我尝试安装 new iproute,但仍然,选项识别似乎不起作用!。
如果我要编写一个脚本(或代码)来列出网络命名空间中的所有进程,或者给定一个 PID,显示它属于哪个网络命名空间,我应该如何进行?(我需要一些进程的信息,以检查它们是否正确netns)
Sté*_*las 17
你可以这样做:
netns=myns
find -L /proc/[1-9]*/task/*/ns/net -samefile /run/netns/"$netns" | cut -d/ -f5
Run Code Online (Sandbox Code Playgroud)
或与zsh:
print -l /proc/[1-9]*/task/*/ns/net(e:'[ $REPLY -ef /run/netns/$netns ]'::h:h:t)
Run Code Online (Sandbox Code Playgroud)
它检查/proc/*/task/*/ns/net符号链接指向的文件的 inode与ip netns addin绑定安装的文件的 inode /run/netns。这基本上是什么ip netns identify或ip netns pid在较新版本的iproute2do 中。
这适用linux-image-generic-lts-trusty于 Ubuntu 12.04 上的软件包中的 3.13 内核,但不适用于 12.04 的第一个版本中的 3.2 内核,其中/proc/*/ns/*没有符号链接,并且每个net进程和任务中的每个文件都获得不同的 inode,这无法帮助确定命名空间会员资格。
2011 年该提交添加了对此的支持,这意味着您需要内核 3.8 或更新版本。
对于较旧的内核,您可以尝试运行一个程序来侦听命名空间中的 ABSTRACT 套接字,然后尝试进入每个进程的命名空间以查看是否可以连接到该套接字,例如:
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
Run Code Online (Sandbox Code Playgroud)
小智 6
ps $(ip netns pids myns)myns你的命名空间在
哪里