커널 4.1 이상에는 /proc/[pid]/status
다음 4줄이 포함되어 있습니다:
NStgid: 1
NSpid: 1
NSpgid: 1
NSsid: 1
이를 통해 상위 네임스페이스의 프로세스가 모든 네임스페이스에 있는 프로세스의 PID를 알 수 있습니다. 그러나 이 줄은 커널 4.1에만 추가되었으므로 커널 3.10에서는 사용할 수 없습니다.
그렇다면 프로세스 PID가 주어지면 모든 네임스페이스에서 해당 프로세스의 PID를 어떻게 얻습니까? 아니면 적어도 커널 3.10에서는 프로세스가 속한 가장 깊은 네임스페이스의 PID를 얻습니까? 프로덕션 서버이기 때문에 커널 업그레이드가 불가능하기 때문에 이런 큰 변화는 매우 어렵습니다.
답변1
바라보다 /proc/[pid]/sched
:
$ cat /proc/8416/sched
bash (918, #threads: 1)
-------------------------------------------------------------------
se.exec_start : 2664031641.263979
se.vruntime : 2781932.438772
se.sum_exec_runtime : 5.544571
se.nr_migrations : 5
8416
네임스페이스의 pid이고 918
호스트 pid입니다.
따라서 호스트 pid가 주어지면 918
이는 nsenter
네임스페이스이며 모든 프로세스를 나열합니다.
nsenter --target 918 --mount --uts --ipc --net --pid ps
PID USER TIME COMMAND
8416 java-app 0:00 /bin/bash
8606 root 0:00 -bash
15416 root 0:00 -bash
/proc/8416,8606,15416/sched
어느 것이 호스트 pid와 일치하는지 확인하세요 918
. 그게 답입니다.