커널 3.10에서 NSPid를 얻는 방법

커널 3.10에서 NSPid를 얻는 방법

커널 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. 그게 답입니다.

위의 영감은 jattach this에서 비롯되었습니다.질문범죄.

관련 정보