GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Wie finde ich den Namensraum eines bestimmten Prozesses heraus?

Ich habe bereits eine Frage zum Auflisten aller Namensräume in Linux gestellt, aber es gab keine richtigen und genauen Antworten. Daher möchte ich eine Methode finden, die mir helfen kann, den Namensraum der PID eines Prozesses oder einer Gruppe von Prozessen herauszufinden Prozesse. Wie kann das unter Linux gemacht werden?

Akzeptierte Antwort:

Ich werde versuchen, diese und Ihre frühere Frage zu beantworten, da sie zusammenhängen.

Die Türen zu Namensräumen sind Dateien in /proc/*/ns/* und /proc/*/task/*/ns/* .

Ein Namespace wird durch einen Prozess unsharing erstellt seinen Namensraum. Ein Namespace kann dann durch bind-mounten dauerhaft gemacht werden die ns Datei an einen anderen Ort.

Das ist ip netns tut zum Beispiel für net Namensräume. Es gibt sein net frei Namespace und bind-mounts /proc/self/ns/net nach /run/netns/netns-name .

In einem /proc im Root-PID-Namensraum gemountet ist, können Sie alle Namensräume auflisten, die einen Prozess enthalten, indem Sie Folgendes tun:

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

Die Zahl in eckigen Klammern ist die Inode-Nummer.

So erhalten Sie das für einen bestimmten Prozess:

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

Jetzt kann es permanent geben Namespaces, die keinen Prozess enthalten. Sie herauszufinden, kann viel schwieriger sein, AFAICT.

Zunächst muss man bedenken, dass es mehrere mount geben kann Namensräume.

# 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

Diese /mnt/1/a , /run/netns/a können Namespace-Dateien sein.

Wir können eine Inode-Nummer erhalten:

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

Aber das sagt uns nicht viel mehr, als dass es nicht in der oben berechneten Liste enthalten ist.

Wir können versuchen, es als einen der verschiedenen Typen einzugeben:

# 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, das war ein net Namespace-Datei.

Es scheint also, als hätten wir eine Methode, um die Namensräume aufzulisten:listen Sie die ns auf Verzeichnisse aller Tasks, dann finden Sie alle proc Einhängepunkte in allen /proc/*/task/*/mountinfo und finden Sie ihren Typ heraus, indem Sie versuchen, sie einzugeben.

Verwandte:KSS - Linux Shell 1 Cheat Sheet
Linux
  1. So finden Sie die Liste aller offenen Ports in Linux heraus

  2. Welche Linux-Version verwende ich? So finden Sie es heraus

  3. 4 Möglichkeiten, einen CPU-Kern herauszufinden, der einen bestimmten Prozess in Linux ausführt

  4. Wie finde ich heraus, welcher Prozess eine Datei in Linux gesperrt hat?

  5. Wie beendet man einen Prozess, der auf einem bestimmten Port in Linux läuft?

So finden Sie heraus, welche Version des Linux-Kernels auf Ihrem PC läuft

So finden Sie heraus, wie lange ein Prozess unter Linux läuft

So finden Sie die IP-Adresse unter Linux

So finden Sie den Hostnamen unter Linux

So finden Sie heraus, zu welchen Gruppen ein Benutzer in Linux gehört

So beenden Sie den laufenden Linux-Prozess auf einem bestimmten Port