是否可以檢查不同 pid 命名空間中子程序的程序 ID?
是否可以找到位於單獨 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)
orsetns(2)
)進行檢查,還必須注意創建一個新的虛擬掛載命名空間(使用unshare(1)
,unshare(2)
orclone(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