네트워크 네임스페이스에 속하는 프로세스를 나열하는 방법은 무엇입니까?

네트워크 네임스페이스에 속하는 프로세스를 나열하는 방법은 무엇입니까?

Ubuntu 12.04를 사용하고 있는데 ip유틸리티에 옵션이 없습니다 ip netns identify <pid>. 새로 설치하려고 했지만 iproute여전히 옵션이 있습니다확인하다작동하지 않는 것 같습니다!

네트워크 네임스페이스의 모든 프로세스를 나열하거나 PID를 제공하여 해당 프로세스가 속한 네트워크 네임스페이스를 표시하는 스크립트(또는 코드)를 작성하려면 어떻게 진행해야 합니까? (올바른지 확인하려면 일부 프로세스에 대한 정보가 필요합니다 netns.)

답변1

다음을 수행할 수 있습니다.

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/run/netnsip netns identifyip netns pid새로운 버전의 iproute2do.

이는 linux-image-generic-lts-trustyUbuntu 12.04 패키지의 3.13 커널에서는 작동하지만 12.04 첫 번째 버전의 3.2 커널에서는 작동하지 않습니다. 여기서는 /proc/*/ns/*심볼릭 링크가 없고 net각 프로세스 및 작업의 각 파일이 다른 inode를 가져오므로 네임스페이스를 결정하는 데 도움이 되지 않습니다. 회원.

이는 다음에서 지원됩니다.그 약속2011년에는 커널 3.8 이상이 필요하다는 의미입니다.

이전 커널의 경우 네임스페이스의 추상 소켓을 수신하는 프로그램을 실행한 다음 각 프로세스의 네임스페이스를 입력하여 다음과 같이 소켓에 연결할 수 있는지 확인할 수 있습니다.

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

답변2

ps $(ip netns pids myns)myns네 네임스페이스는 어디에 있어?

답변3

이 질문에는 Ubuntu 12.04가 구체적으로 언급되어 있지만 16.04와 같은 최신 배포판에는 다음과 같은 명령이 있다는 것을 알았습니다.ip netns pids <nsname>

답변4

안타깝게도 -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

관련 정보