Listen Sie Prozesse auf, die zu einem Netzwerk-Namespace gehören

7

Ich bin auf Ubuntu 12.04 und das ipDienstprogramm hat keine ip netns identify <pid>Option. Ich habe versucht, eine neue zu installieren iproute, aber die Option " Identifizieren" scheint immer noch nicht zu funktionieren.

Wenn ich ein Skript (oder einen Code) schreiben würde, um alle Prozesse in einem Netzwerk-Namespace aufzulisten, oder eine PID erhalten würde, zeigen Sie, zu welchem ​​Netzwerk-Namespace es gehört, wie soll ich vorgehen? (Ich benötige Informationen zu einigen Prozessen, um zu überprüfen, ob sie richtig sind. netns)

vyom
quelle

Antworten:

15

Sie könnten so etwas tun wie:

netns=myns
find -L /proc/[1-9]*/task/*/ns/net -samefile /run/netns/"$netns" | cut -d/ -f5

Oder mit zsh:

print -l /proc/[1-9]*/task/*/ns/net(e:'[ $REPLY -ef /run/netns/$netns ]'::h:h:t)

Es überprüft den Inode der Datei, auf die der /proc/*/task/*/ns/netSymlink verweist, mit denen der Dateien, die von ip netns addin bindmounted gemountet wurden /run/netns. Das ist im Grunde was ip netns identifyoder ip netns pidin neueren Versionen von iproute2do.

Das funktioniert mit dem 3.13-Kernel wie aus dem linux-image-generic-lts-trustyPaket unter Ubuntu 12.04, aber nicht mit dem 3.2-Kernel aus der ersten Version von 12.04, wo /proc/*/ns/*es keine Symlinks gibt und jede netDatei dort von jedem Prozess und jeder Aufgabe einen anderen Inode erhält, der nicht helfen kann, den Namespace zu bestimmen Mitgliedschaft.

Die Unterstützung dafür wurde durch dieses Commit im Jahr 2011 hinzugefügt , was bedeutet, dass Sie Kernel 3.8 oder neuer benötigen.

Bei älteren Kerneln können Sie versuchen, ein Programm auszuführen, das einen ABSTRACT-Socket im Namespace abhört, und dann versuchen, den Namespace jedes Prozesses einzugeben, um festzustellen, ob Sie dort eine Verbindung zu diesem Socket herstellen können, wie:

sudo ip netns exec "$netns" socat abstract-listen:test-ns,fork /dev/null &
ps -eopid= |
  while read p; do
    nsenter -n"/proc/$p/ns/net" socat -u abstract:test-ns - 2> /dev/null &&
      echo "$p"
  done
Stéphane Chazelas
quelle
Ich habe das erste Formular verwendet (ich verwende es bash), aber beim Ausführen wird eine Fehlermeldung angezeigt find -L /proc/*/task/*/ns/net -samefile /run/netns/"$netns" find: '/proc/self/task/8964/ns/net': No such file or directory (wo 8964befindet sich die aktuelle pid [ $$]) - sollte ich dies im defaultNamespace ausführen ?
Vyom
@vyom, ja aus dem PID- und Mount-Namespace der obersten Ebene (obwohl Sie vermutlich Netns in anderen Mount-Namespaces erstellen könnten, die diesen Befehl ungültig machen würden).
Stéphane Chazelas
scheint nicht für mich zu funktionieren :(. Ich habe es versucht /und ich habe das netnsauf die übliche Weise erstellt - ip netns addund ich kann es sehen /var/run/netns/. Ich bin mir nicht sicher, was ich vermisse
vyom
@vyom, grep /run/netns /proc/self/mountinfomeldet etwas? Welche Kernel-Version verwenden Sie ( uname -rs)?
Stéphane Chazelas
2
ip netns helplistet den Befehl auf, netns pids NAMEder, wie ich denke, alle Pids in einem Namen netns auflisten soll.
Mikeserv
3

In der Frage wird speziell Ubuntu 12.04 erwähnt, aber ich stelle fest, dass es in neueren Distributionen wie 16.04 einen Befehl gibt, der genau dies tut: ip netns pids <nsname>

gequetscht
quelle
1
Funktioniert leider ip netnsnur auf Netzwerk-Namespaces, die /run/netns(auch /var/run/netns) gebunden sind . Es ist völlig unwissend gegenüber anderen Netzwerk-Namespaces, die entweder an anderen Stellen gebunden sind, wie z. B. /run/docker, und es ist insbesondere völlig unwissend /proc.
TheDiveO
1

Namespace-Lister:

Sie können listns.py verwenden mit: ./listns.pyoder python2 listns.py ( Quelle: Github-Mirror und Artikel ; alle Dank an Ralf Trezeciak )

IP-Netns :

Kann mit folgendem durchgeführt werden (ersetzen Sie $ namespace-name):

ip netns pids $namespace-name | xargs ps -o pid,command -p

Nsutils

Stellen Sie netnslistdiese Liste aller Netz-Namespaces und aller Prozesse bereit, die in jedem Namespace ausgeführt werden:

Intika
quelle
0

Als ich innerhalb des Containers und nicht außerhalb lief, stellte ich fest, dass der Trick mit der gleichen Datei leider nicht funktionierte. Ich bin mir nicht sicher warum, da es das gleiche Inode war. Auf jeden Fall hat dies jedoch funktioniert, nur für den Fall, dass es für irgendjemanden von Nutzen ist:

netns=mynamespace
inode=$(ls -i /var/run/netns/$netns | cut -f1 -d" ")
pids=$(find -L /proc/[1-9]*/task/*/ns/net -inum $inode | cut -f3 -d"/" | uniq)
ps -p $pids
Neil McGill
quelle