Linux에서 모든 네임 스페이스를 나열하는 방법에 대한 질문을 이미 했지만 정확하고 정확한 답변이 없으므로 일부 프로세스 또는 그룹의 PID 네임 스페이스를 찾는 데 도움이되는 방법을 찾고 싶습니다. 프로세스. 리눅스에서 어떻게 할 수 있습니까?
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를 참조 하십시오
lsns
매우 유용하지만 각 네임 스페이스에서 가장 낮은 PID 만 표시합니다. 즉, 임의의 PID에 대한 네임 스페이스를 알려줄 수 없습니다. 어쨌든 +1은 질문에 직접 답변하지 않더라도 여전히 유용한 답변입니다.
$ ip netns identify $PID
$PID
다양한 방법으로 얻을 수있는 프로세스의 프로세스 ID는 어디에 있습니까 ?
ip netns
(또는 적어도 / run / netns에서 네임 스페이스 문을 바인딩 마운트하는 것에 의해 생성 된 네임 스페이스 ip netns
)에 대해서만 사용 됩니다. 기본적으로 / run / netns에서와 동일한 파일을 찾습니다 /proc/$PID/ns/net
.
/run/netns
내 컴퓨터에도 존재하지 않습니다.
/run/netns
또는 ip
네임 스페이스 특수 파일을 바인드 마운트 할 때마다 . findmnt -t nsfs
시스템의 어디에 있는지 알려줄 수 있습니다. OTOH, 당신이 할 경우 unshare -n sleep 1000 & ip netns identify "$!"
, 당신은 아무것도 얻지 못할 것입니다.
findmnt -t nsfs
- 아무것도. unshare -n sleep 1000 & ip netns identify "$!"
-공유 해제 : 공유 해제 실패 : 작업이 허용되지 않음
findmnt -t nsfs
아무것도 반환하지 않으면 컴퓨터 ATM에 네크가 없음을 나타냅니다.
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 459
에 xargs ps -f
당신이 과정에 대해 필요한 정보를 검색 할 생각.
listns.py 를 사용할 수 있습니다
사용법 : ./listns.py
또는 python2 listns.py
이 질문에 정확하게 대답하기 위해 다음과 같이 결과를 grep 할 수 있습니다 python2 listns.py | grep $PID
(pid 변수를 대체하십시오)
출처 : GitHub의 거울 과 기사 에 대한 모든 신용 랄프 Trezeciak
네트워크 네임 스페이스의 경우 ip netns identify $PID
사용할 수 있습니다.
pidnslist
프로세스의 pid 네임 스페이스를 리턴하도록 제공
$ pidnslist -ss 8782
pid:[4026531836]