특정 프로세스의 네임 스페이스를 찾는 방법은 무엇입니까? 대한 질문을 이미 했지만

Linux에서 모든 네임 스페이스를 나열하는 방법에 대한 질문을 이미 했지만 정확하고 정확한 답변이 없으므로 일부 프로세스 또는 그룹의 PID 네임 스페이스를 찾는 데 도움이되는 방법을 찾고 싶습니다. 프로세스. 리눅스에서 어떻게 할 수 있습니까?



답변

나는 이것과 당신의 이전 질문 이 관련되어 있기 때문에 노력하고 대답 할 것 입니다.

네임 스페이스의 문은 /proc/*/ns/*및에 있는 파일입니다 /proc/*/task/*/ns/*.

네임 스페이스는 네임 스페이스를 공유하지 않는 프로세스에 의해 생성됩니다 . 그런 다음 파일을 다른 곳에 바인드 마운트 하여 네임 스페이스를 영구적으로 만들 수 있습니다 ns.

그 무엇 ip netns에 대한 예를 들어 않습니다 네임 스페이스. 그것은 그것의 공유 해제 net네임 스페이스와 바인드 마운트 /proc/self/ns/net에 ./run/netns/netns-name

A는에서 /proc루트 PID 네임 스페이스에 장착, 당신은 수행하여 이들의 프로세스를 모든 네임 스페이스를 나열 할 수 있습니다 :

# readlink /proc/*/task/*/ns/* | sort -u
ipc:[4026531839]
mnt:[4026531840]
mnt:[4026531856]
mnt:[4026532469]
net:[4026531956]
net:[4026532375]
pid:[4026531836]
pid:[4026532373]
uts:[4026531838]

대괄호 안의 숫자는 아이 노드 숫자입니다.

주어진 프로세스에 대해 그것을 얻으려면 :

# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid

이제 프로세스가없는 영구 네임 스페이스가 있을 수 있습니다 . 그것들을 찾는 것은 훨씬 까다로운 AFAICT 일 수 있습니다.

먼저 마운트 네임 스페이스 가 여러 개있을 수 있음을 명심해야 합니다.

# awk '$9 == "proc" {print FILENAME,$0}' /proc/*/task/*/mountinfo | sort -k2 -u
/proc/1070/task/1070/mountinfo 15 19 0:3 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
/proc/19877/task/19877/mountinfo 50 49 0:3 / /run/netns/a rw,nosuid,nodev,noexec,relatime shared:2 - proc proc rw
/proc/19877/task/19877/mountinfo 57 40 0:3 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
/proc/1070/task/1070/mountinfo 66 39 0:3 / /run/netns/a rw,nosuid,nodev,noexec,relatime shared:2 - proc proc rw
/proc/19877/task/19877/mountinfo 68 67 0:3 / /mnt/1/a rw,nosuid,nodev,noexec,relatime unbindable - proc proc rw

사람들은 /mnt/1/a, /run/netns/a네임 스페이스 파일이있을 수 있습니다.

우리는 inode 번호를 얻을 수 있습니다 :

# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a

그러나 그것은 위에서 계산 된 목록에없는 것 이외의 많은 것을 알려주지 않습니다.

우리는 다른 유형으로 시도하고 입력 할 수 있습니다.

# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --pid=/mnt/1/a true
nsenter: reassociate to namespace 'ns/pid' failed: Invalid argument
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --mount=/mnt/1/a true
nsenter: reassociate to namespace 'ns/mnt' failed: Invalid argument
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --net=/mnt/1/a true
#

네, net네임 스페이스 파일이었습니다.

따라서 우리는 네임 스페이스를 나열하는 방법이있는 것 같습니다 : ns모든 작업 의 디렉토리를 나열 한 다음 모든 proc마운트 포인트 를 찾아서 /proc/*/task/*/mountinfo입력하여 유형을 알아냅니다.


답변

당신이있는 경우 폴더의 유틸리티 – 리눅스 v2.28 또는 이상 사용할 수 LSN이를 :

# lsns
        NS TYPE  NPROCS   PID USER             COMMAND
4026531836 pid       78     1 root             /sbin/init
4026531837 user      79     1 root             /sbin/init
4026531838 uts       78     1 root             /sbin/init
4026531839 ipc       78     1 root             /sbin/init
4026531840 mnt       75     1 root             /sbin/init
4026531857 mnt        1    12 root             kdevtmpfs
4026531957 net       79     1 root             /sbin/init
4026532393 mnt        1  1214 root             /lib/systemd/systemd-udevd
4026532415 mnt        1  2930 systemd-timesync /lib/systemd/systemd-timesyncd
4026532477 mnt        1 32596 root             -bash
4026532478 uts        1 32596 root             -bash
4026532479 ipc        1 32596 root             -bash
4026532480 pid        1 32596 root             -bash

수정 : lsns는 util-linux v2.27에서 사용할 수 없었습니다. https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes를 참조 하십시오


답변

$ ip netns identify $PID

$PID다양한 방법으로 얻을 수있는 프로세스의 프로세스 ID는 어디에 있습니까 ?

http://man7.org/linux/man-pages/man8/ip-netns.8.html


답변

ps이제 프로세스와 관련된 네임 스페이스의 다양한 유형의 출력 옵션이 있습니다 : ipcns, mntns, netns, pidns, userns,와 utsns. 이 질문의 경우 관련 네임 스페이스는 PID 네임 스페이스 또는 pidns입니다.

따라서 pid 459와 같은 PID 네임 스페이스 ID를 찾으려면 다음을 수행하십시오.

# ps -h -o pidns -p 459
4026532661

해당 네임 스페이스의 모든 프로세스를 나열합니다.

ps -o pidns,pid,cmd | awk '$1==4026532661'

나에 pgrep, 당신은 같은 PID 네임 스페이스를 공유하는 모든 프로세스의 목록에 PID에서 직접 갈 수 있습니다 :

pgrep -a --ns 459

달리 ps, pgrep매우 제한된 출력 포맷 기능을 (당신이 그것의 프로세스 중 하나의 PID를 알고있는 경우) 특정 네임 스페이스에 대한 출력을 제한하지만,이 수 (PID를 만 PID를 자신의 명령 줄 또는)

당신은 할 수 항상 파이프의 출력 pgrep --ns 459xargs ps -f당신이 과정에 대해 필요한 정보를 검색 할 생각.


답변

네임 스페이스 리스너 :

listns.py 를 사용할 수 있습니다

사용법 : ./listns.py또는 python2 listns.py이 질문에 정확하게 대답하기 위해 다음과 같이 결과를 grep 할 수 있습니다 python2 listns.py | grep $PID(pid 변수를 대체하십시오)

출처 : GitHub의 거울기사 에 대한 모든 신용 랄프 Trezeciak

네트워크 네임 스페이스 :

네트워크 네임 스페이스의 경우 ip netns identify $PID사용할 수 있습니다.

Nsutils

pidnslist프로세스의 pid 네임 스페이스를 리턴하도록 제공

$ pidnslist -ss 8782
pid:[4026531836]


답변