web-dev-qa-db-ja.com

特定のプロセスの名前空間を見つける方法は?

私はすでに Linuxですべての名前空間をリストする方法 について質問しましたが、正確で正確な答えがなかったので、名前空間を見つけるのに役立つ方法を見つけたいと思います一部のプロセスまたはプロセスのグループのPID。 Linuxではどのように実行できますか?

25
zerospiel

これと 前の質問 の両方が関連しているので、両方に答えてみます。

名前空間への扉は/proc/*/ns/*/proc/*/task/*/ns/*のファイルです。

名前空間は、その名前空間のプロセスunsharingによって作成されます。ネームスペースは、nsファイルを他の場所にbind-mountingすることで永続的にすることができます。

これが、たとえばnet名前空間に対してip netnsが行うことです。 net名前空間の共有を解除し、/proc/self/ns/net/run/netns/netns-nameにバインドマウントします。

ルートpid名前空間にマウントされた/procでは、次のようにして、プロセスが含まれているすべての名前空間を一覧表示できます。

# readlink /proc/*/task/*/ns/* | sort -u
ipc:[4026531839]
mnt:[4026531840]
mnt:[4026531856]
mnt:[4026532469]
net:[4026531956]
net:[4026532375]
pid:[4026531836]
pid:[4026532373]
uts:[4026531838]

大括弧内の数字はiノード番号です。

特定のプロセスでそれを取得するには:

# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid

現在、永続的な名前空間があり、その中にプロセスはありません。それらを見つけることは非常にトリッキーなAFAICTになる可能性があります。

まず、複数のmount名前空間が存在する可能性があることを覚えておく必要があります。

# awk '$9 == "proc" {print FILENAME,$0}' /proc/*/task/*/mountinfo | sort -k2 -u
/proc/1070/task/1070/mountinfo 15 19 0:3 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
/proc/19877/task/19877/mountinfo 50 49 0:3 / /run/netns/a rw,nosuid,nodev,noexec,relatime shared:2 - proc proc rw
/proc/19877/task/19877/mountinfo 57 40 0:3 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
/proc/1070/task/1070/mountinfo 66 39 0:3 / /run/netns/a rw,nosuid,nodev,noexec,relatime shared:2 - proc proc rw
/proc/19877/task/19877/mountinfo 68 67 0:3 / /mnt/1/a rw,nosuid,nodev,noexec,relatime unbindable - proc proc rw

これらの/mnt/1/a/run/netns/aは名前空間ファイルである可能性があります。

Iノード番号を取得できます。

# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a

しかし、それは、上記で計算されたリストにないこと以外は、私たちに多くを伝えません。

さまざまなタイプとして入力してみることができます。

# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --pid=/mnt/1/a true
nsenter: reassociate to namespace 'ns/pid' failed: Invalid argument
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --mount=/mnt/1/a true
nsenter: reassociate to namespace 'ns/mnt' failed: Invalid argument
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --net=/mnt/1/a true
#

OK、それはnet名前空間ファイルでした。

したがって、名前空間を一覧表示する方法があるように思われます。すべてのタスクのnsディレクトリを一覧表示し、すべての/proc/*/task/*/mountinfoですべてのprocマウントポイントを見つけて、把握します。それらを入力しようとすることによってそれらのタイプ。

39

util-linux v2.28以降を使用している場合は、lsns

# lsns
        NS TYPE  NPROCS   PID USER             COMMAND
4026531836 pid       78     1 root             /sbin/init
4026531837 user      79     1 root             /sbin/init
4026531838 uts       78     1 root             /sbin/init
4026531839 ipc       78     1 root             /sbin/init
4026531840 mnt       75     1 root             /sbin/init
4026531857 mnt        1    12 root             kdevtmpfs
4026531957 net       79     1 root             /sbin/init
4026532393 mnt        1  1214 root             /lib/systemd/systemd-udevd
4026532415 mnt        1  2930 systemd-timesync /lib/systemd/systemd-timesyncd
4026532477 mnt        1 32596 root             -bash
4026532478 uts        1 32596 root             -bash
4026532479 ipc        1 32596 root             -bash
4026532480 pid        1 32596 root             -bash

訂正:lsnsはutil-linux v2.27では使用できませんでした。 https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes を参照してください

19
Rfraile
$ ip netns identify $PID

どこ $PIDはプロセスIDです。プロセスのさまざまな方法で取得できます。

http://man7.org/linux/man-pages/man8/ip-netns.8.html

9
Ken Sharp

psに、プロセスに関連付けられたさまざまなタイプの名前空間の出力オプションが追加されました:ipcnsmntnsnetnspidnsuserns、およびutsns。この質問の場合、関連するのはPID名前空間、またはpidnsです。

たとえば、pid 459などのPID名前空間IDを確認したい場合は、次のようにします。

# ps -h -o pidns -p 459
4026532661

そして、その名前空間のすべてのプロセスを一覧表示します。

ps -o pidns,pid,cmd | awk '$1==4026532661'

またはpgrepを使用すると、PIDから同じPID名前空間を共有するすべてのプロセスのリストに直接移動できます。

pgrep -a --ns 459

psとは異なり、pgrepは出力を特定の名前空間に制限できます(その中の1つのプロセスのPIDがわかっている場合)。ただし、出力フォーマット機能は非常に制限されています(PIDのみ、またはPIDとそのコマンドライン)

pgrep --ns 459の出力をいつでもxargs ps -fにパイプして、プロセスについて必要な情報を取得できます。

9
cas

Namespace-Lister

listns.pyを使用できます

使用法: ./listns.pyまたはpython2 listns.pyこの質問に正確に答えるには、次のように結果をgrepしますpython2 listns.py | grep $PID(pid変数を置き換えます)

出典: github-mirror および articleすべてのクレジット Ralf Trezeciak

ネットワーク名前空間

ネットワーク名前空間の場合、ip netns identify $PID に使える。

Nsutils

プロセスのpid名前空間を返すpidnslistを提供します

$ pidnslist -ss 8782
pid:[4026531836] 
0
intika