список процессов, принадлежащих сетевому пространству имен

Я на Ubuntu 12.04, и у ip утилиты нет ip netns identify <pid> , я попытался установить новый iproute , но, тем не менее, опция идентификации , похоже, не работает !.

Если бы я должен был написать сценарий (или код), чтобы перечислить все процессы в пространстве имен сетей или указать PID, покажите, к какому пространству имен сетей он принадлежит, как мне следует продолжить? (Мне нужна информация о нескольких процессах, чтобы проверить, находятся ли они в правильных netns )

  • узнать об общем протоколировании / логротации на Linux?
  • Невозможно скомпилировать XBMC 12 из-за проблемы TAGLIB
  • Как получить CentOS 6.5 gui?
  • Потенциальные источники задержки задержки 5us-20us при отправке длинного блока последовательных данных на устройство tty?
  • Где в ядре / dev / kmsg инициализируется?
  • Как изменить размер шрифта при использовании lp в Linux?
  • Как установить glibc.i686 с использованием rpm с разрешенной зависимостью
  • Все возможные перестановки слов в разных файлах попарно
  • Как свести к минимуму объем работы Firefox?
  • Bash - дата, работающая над ошибкой 2038 на 32-битной системе LINUX
  • ping работает, но завиток не
  • Как исправить Ctrl + стрелки в Vim?
  • 3 Solutions collect form web for “список процессов, принадлежащих сетевому пространству имен”

    Вы могли бы сделать что-то вроде:

     netns=myns find -L /proc/[1-9]*/task/*/ns/net -samefile /run/netns/"$netns" | cut -d/ -f5 

    Или с zsh :

     print -l /proc/[1-9]*/task/*/ns/net(e:'[ $REPLY -ef /run/netns/$netns ]'::h:h:t) 

    Он проверяет индексный дескриптор файла, который символическая ссылка /proc/*/task/*/ns/net указывает на то, что файлы, связанные с подключением, устанавливаются ip netns add in /run/netns . Это в основном то, что ip netns identify или ip netns pid в более новых версиях iproute2 .

    Это работает с ядром 3.13, как из пакета linux-image-generic-lts-trusty на Ubuntu 12.04, но не с ядром 3.2 из первой версии 12.04, где /proc/*/ns/* не являются символическими ссылками, а каждая net файл из каждого процесса и задачи получает другой индекс, который не может помочь определить членство в пространстве имен.

    Поддержка этого была добавлена этим фиксатором в 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 

    При запуске внутри контейнера, в отличие от внешнего, я обнаружил, что трюк -samefile печально не работает. Не знаю, почему, поскольку это был тот же самый индекс. Во всяком случае, это, однако, сработало, на всякий случай это полезно для всех:

     netns=mynamespace inode=$(ls -i /var/run/netns/$netns | cut -f1 -d" ") pids=$(find -L /proc/[1-9]*/task/*/ns/net -inum $inode | cut -f3 -d"/" | uniq) ps -p $pids 

    В вопросе конкретно упоминается Ubuntu 12.04, но я отмечаю, что на более новых дистрибутивах, таких как 16.04, есть команда, которая делает именно это: ip netns pids <nsname>

    Linux и Unix - лучшая ОС в мире.