lista processos pertencentes a um namespace de rede

5

Eu estou no Ubuntu 12.04, e o utilitário ip não tem a opção ip netns identify <pid> , eu tentei instalar o novo iproute , mas ainda assim, a opção identificar não parece estar trabalhando!.

Se eu fosse escrever um script (ou código) para listar todos os processos em um namespace de rede, ou dado um PID, mostre a qual namespace de rede ele pertence, como devo proceder? (Eu preciso de informações em um punhado de processos, para verificar se eles estão no netns )

    
por vyom 30.06.2015 / 11:52

4 respostas

12

Você pode fazer algo como:

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

Ou com zsh :

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

Ele verifica o inode do arquivo para o qual o link simbólico /proc/*/task/*/ns/net aponta para os arquivos montados por ip netns add in /run/netns . Isso é basicamente o que ip netns identify ou ip netns pid nas versões mais recentes de iproute2 do.

Isso funciona com o kernel 3.13 a partir do pacote linux-image-generic-lts-trusty no Ubuntu 12.04, mas não com o kernel 3.2 da primeira versão do 12.04, onde /proc/*/ns/* não são symlinks e cada net de cada processo e tarefa recebe um inode diferente que não pode ajudar a determinar a associação ao namespace.

O suporte para isso foi adicionado por que se compromete em 2011, o que significa que você precisa do kernel 3.8 ou mais recente.

Com kernels mais antigos, você poderia tentar executar um programa escutando em um soquete ABSTRACT no namespace, e então tentar entrar no namespace de cada processo para ver se você pode se conectar a esse socket lá como:

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
    
por 30.06.2015 / 13:31
2

A questão menciona especificamente o Ubuntu 12.04, mas noto que em distros mais novas como 16.04 existe um comando que faz exatamente isto: ip netns pids <nsname>

    
por 27.03.2017 / 05:50
0

Ao correr dentro do contêiner, e não ao lado de fora, achei que o truque -samefile infelizmente não funcionava. Não tenho certeza porque, porque era o mesmo inode. De qualquer forma, isso funcionou, no caso de ser útil para qualquer pessoa:

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
    
por 15.02.2017 / 21:49
-1

ps $(ip netns pids myns) onde myns é seu namespace

    
por 01.08.2018 / 14:41