GNU/Linux >> Linux の 問題 >  >> 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]

角括弧内の数字は inode 番号です。

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

# 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 名前空間ファイルの可能性があります。

inode 番号を取得できます:

# 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 のマウントポイント それらを入力してみて、それらのタイプを把握してください。


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

訂正:この回答が言っていたように、util-linux v2.27 では lsns は使用できません。 https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes を参照


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 へ ただし、プロセスについて必要な情報を取得するためです。


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

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

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

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

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

  3. プロセスの祖先チェーンを見つける方法は?

  1. Debian –特定のパッケージがどのようにインストールされたかを知る方法は?

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

  3. すべての子プロセスを見つける方法は?