如何在内核 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 918nsenter它是命名空间并列出所有进程:

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 这个问题和这个犯罪

相关内容