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/netns
ip netns identify
ip netns pid
새로운 버전의 iproute2
do.
이는 linux-image-generic-lts-trusty
Ubuntu 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