如何列出属于网络命名空间的进程?

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 identifyip 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)

  • `ip netns help` 列出了命令 `netns pids NAME`,我认为它应该列出名称 netns 中的所有 pid。 (2认同)

小智 6

ps $(ip netns pids myns)myns你的命名空间在 哪里

  • 与 https://unix.stackexchange.com/a/354038/117549 非常相似 (2认同)