GNU/Linux >> Linux の 問題 >  >> Linux

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

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

承認された回答:

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

名前付けへの扉は、/proc/*/ns/*内のファイルです。 および/proc/*/task/*/ns/*

名前空間は、共有解除プロセスによって作成されます その名前空間。名前空間は、 bind-mountingによって永続的にすることができます。 ns 他の場所にファイルします。

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

/proc内 ルートpid名前空間にマウントされている場合、次の手順を実行すると、プロセスが含まれるすべての名前空間を一覧表示できます。

# 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になる可能性があります。

まず、いくつかのマウントが存在する可能性があることに注意する必要があります。 名前名。

# 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を見つけます すべての/proc/*/task/*/mountinfoのマウントポイント 入力してタイプを把握します。

関連:KSS-LinuxShell1チートシート
Linux
  1. 実行しているLinuxバージョンは何ですか?調べる方法は次のとおりです

  2. Linux でどのプロセスがファイルをロックしているかを調べるにはどうすればよいですか?

  3. プロセスが機能するために必要な Linux の機能を調べる方法は?

  1. Linuxで開いているすべてのポートのリストを見つける方法

  2. Linuxでゾンビプロセスを見つけて殺す方法

  3. Linuxで特定のプロセスを実行しているCPUコアを見つける4つの方法

  1. Linux の特定のポートで実行されているプロセスを強制終了するには?

  2. Linuxでファイルを使用しているプロセスを見つける方法は?

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