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

Wie finde ich den Namensraum eines bestimmten Prozesses heraus?

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 hebt die Freigabe seines net auf Namespace und Bind-Mounts /proc/self/ns/net bis /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 den ns auf Verzeichnisse aller Aufgaben, dann finden Sie alle proc Einhängepunkte in allen /proc/*/task/*/mountinfo und finden Sie ihren Typ heraus, indem Sie versuchen, sie einzugeben.


Wenn Sie util-linux v2.28 oder höher haben Sie können lsns verwenden :

# 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

Korrektur:lsns ist in util-linux v2.27 nicht verfügbar, wie diese Antwort früher sagte. Siehe https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes


ps hat jetzt Ausgabeoptionen für die verschiedenen Namensraumtypen, die mit Prozessen verbunden sind:ipcns , mntns , netns , pidns , userns , und utsns . Für diese Frage ist der relevante PID-Namensraum oder pidns .

Wenn Sie also die PID-Namespace-ID für z. B. PID 459 herausfinden möchten:

# ps -h -o pidns -p 459
4026532661

und um alle Prozesse in diesem Namensraum aufzulisten:

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

oder mit pgrep , können Sie direkt von einer PID zu einer Liste aller Prozesse gehen, die denselben PID-Namensraum teilen:

pgrep -a --ns 459

Im Gegensatz zu ps , pgrep kann die Ausgabe auf einen bestimmten Namensraum beschränken (wenn Sie die PID eines der darin enthaltenen Prozesse kennen), hat aber sehr begrenzte Möglichkeiten zur Ausgabeformatierung (nur PIDs oder PIDs und ihre Befehlszeilen)

Sie können die Ausgabe von pgrep --ns 459 immer weiterleiten bis xargs ps -f jedoch, um die Informationen abzurufen, die Sie über den Prozess benötigen.


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

  2. Wie finde ich alle untergeordneten Prozesse?

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

  4. Wie finden Sie heraus, welcher Prozess eine Datei in Linux verwendet?

  5. Wie finde ich heraus, welche Linux-Fähigkeiten ein Prozess benötigt, um zu funktionieren?

3 Möglichkeiten, um herauszufinden, welcher Prozess auf einem bestimmten Port lauscht

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

So finden Sie heraus, welcher Dienst an einem bestimmten Port lauscht

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

So finden Sie den Prozessnamen anhand seiner PID

Wie kann ich herausfinden, welches Server-Betriebssystem auf einer bestimmten Site ausgeführt wird?