Linux

是否可以檢查不同 pid 命名空間中子程序的程序 ID?

  • December 21, 2020

是否可以找到位於單獨 PID 命名空間中的子程序的 PID?

我能夠獲取相對於父命名空間的子程序 PID,但我需要找到相對於子程序目前執行的單獨 PID 命名空間的子程序 PID。

我可以通過 IPC 從孩子那裡獲取 PID,但是有沒有辦法在沒有子程序幫助的情況下找到它?

給定一個程序的 PID,它所屬的所有 PID 命名空間的資訊可從proc 條目中獲得/proc/PID/status

 NStgid                      descendant namespace thread group ID hierarchy

或來自man proc

NStgid : 每個 PID 命名空間中的執行緒組 ID(即 PID)

$$ pid $$是會員。最左邊的條目顯示了與讀取程序的 PID 名稱空間相關的值,然後是連續嵌套的內部名稱空間中的值。(從 Linux 4.1 開始。)

我不知道除了使用/proc來檢索此資訊是否還有其他方法。


這是一個在 LXC-within-a-LXC 容器中啟動的睡眠程序的範例,因此當從初始 PID 命名空間讀取時將有兩個嵌套的 PID(又名 tgid):

# pidof sleep
443701
# grep ^NStgid: /proc/443701/status 
NStgid: 443701  685 170

所以它的 PID 在中間命名空間中是 685,在最終命名空間中是 170:這個程序認為自己的 PID 值為 170。

最後一個條目是程序如何看待自己。

如果父程序在沒有使用較新的clone3(2)系統呼叫的情況下在另一個 PID 命名空間中生成了一個子程序,則無論如何它只會存在於一個額外的 PID 命名空間中,並且它的 pid 將是該行中的第三個和最後一個條目(計NStgid:為第一個條目)。如果通過輸入這些 PID 命名空間(使用nsenter(1)or setns(2))進行檢查,還必須注意創建一個新的虛擬掛載命名空間(使用unshare(1), unshare(2)or clone(2))並/proc在那裡再次掛載,否則/proc條目仍將反映父 PID 命名空間的值並且不會出現改變。

更多範例如下。檢查這是 sleep 命令:

# nsenter -t 443701 -p unshare -m --mount-proc ls -l /proc/170/exe   
lrwxrwxrwx 1 root root 0 Dec 21 23:03 /proc/170/exe -> /bin/sleep

在中間 PID 命名空間中有一個 PID 引用(中間 LXC 容器被命名為stretch-amd64)將允許知道它是如何從那裡看到的:

# lxc-info -Hp -n stretch-amd64
442977
# nsenter -t 442977 -p unshare -m --mount-proc grep ^NStgid: /proc/685/status
NStgid: 685 170

引用自:https://unix.stackexchange.com/questions/625520