특정 프로세스의 네임 스페이스를 찾는 방법은 무엇입니까?


답변:


39

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

네임 스페이스의 문은 /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입력하여 유형을 알아냅니다.


19

당신이있는 경우 폴더의 유틸리티 - 리눅스 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를 참조 하십시오


오래된 리눅스에있는 사람들을 위해 훌륭한 파이썬 스크립트가 있습니다. opencloudblog.com/?p=251
Neil McGill

lsns매우 유용하지만 각 네임 스페이스에서 가장 낮은 PID 만 표시합니다. 즉, 임의의 PID에 대한 네임 스페이스를 알려줄 수 없습니다. 어쨌든 +1은 질문에 직접 답변하지 않더라도 여전히 유용한 답변입니다.
cas

9
$ ip netns identify $PID

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

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


1
네트워크 네임 스페이스와이를 사용하여 생성 된 네임 스페이스 ip netns(또는 적어도 / run / netns에서 네임 스페이스 문을 바인딩 마운트하는 것에 의해 생성 된 네임 스페이스 ip netns)에 대해서만 사용 됩니다. 기본적으로 / run / netns에서와 동일한 파일을 찾습니다 /proc/$PID/ns/net.
Stéphane Chazelas

뭐? /run/netns내 컴퓨터에도 존재하지 않습니다.
Ken Sharp

/run/netns또는 ip네임 스페이스 특수 파일을 바인드 마운트 할 때마다 . findmnt -t nsfs시스템의 어디에 있는지 알려줄 수 있습니다. OTOH, 당신이 할 경우 unshare -n sleep 1000 & ip netns identify "$!", 당신은 아무것도 얻지 못할 것입니다.
Stéphane Chazelas

findmnt -t nsfs- 아무것도. unshare -n sleep 1000 & ip netns identify "$!"-공유 해제 : 공유 해제 실패 : 작업이 허용되지 않음
Ken Sharp

새 netn을 만들려면 수퍼 유저 권한 (CAP_SYS_ADMIN 기능)이 필요합니다. findmnt -t nsfs아무것도 반환하지 않으면 컴퓨터 ATM에 네크가 없음을 나타냅니다.
Stéphane Chazelas

9

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당신이 과정에 대해 필요한 정보를 검색 할 생각.


0

네임 스페이스 리스너 :

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] 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.