GNU/Linux >> Tutoriels Linux >  >> Linux

Comment trouver l'espace de noms d'un processus particulier?

Je vais essayer de répondre à cette question et à votre question précédente, car elles sont liées.

Les portes des espaces de noms sont des fichiers dans /proc/*/ns/* et /proc/*/task/*/ns/* .

Un espace de noms est créé par un processus unsharing son espace de noms. Un espace de noms peut ensuite être rendu permanent par bind-mounting le ns fichier à un autre endroit.

C'est ce que ip netns fait par exemple pour net espaces de noms. Il annule le partage de son net espace de noms et montages liés /proc/self/ns/net à /run/netns/netns-name .

Dans un /proc monté dans l'espace de noms root pid, vous pouvez lister tous les espaces de noms contenant un processus en faisant :

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

Le nombre entre crochets est le numéro d'inode.

Pour obtenir cela pour un processus donné :

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

Maintenant, il peut y avoir permanent espaces de noms qui ne contiennent aucun processus. Les découvrir peut être beaucoup plus délicat AFAICT.

Tout d'abord, vous devez garder à l'esprit qu'il peut y avoir plusieurs montages espaces de noms.

# 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

Ces /mnt/1/a , /run/netns/a peut être des fichiers d'espace de noms.

Nous pouvons obtenir un numéro d'inode :

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

Mais cela ne nous dit pas grand-chose d'autre que ce n'est pas dans la liste calculée ci-dessus.

Nous pouvons essayer de le saisir sous l'un des différents types :

# 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, c'était un net fichier d'espace de noms.

Il semblerait donc que nous ayons une méthode pour lister les espaces de noms :listez les ns répertoires de toutes les tâches, puis trouver tous les proc points de montage dans tous les /proc/*/task/*/mountinfo et déterminez leur type en essayant de les saisir.


Si vous avez util-linux v2.28 ou supérieur vous pouvez utiliser 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

Correction :lsns n'est pas disponible dans util-linux v2.27, comme le disait cette réponse. Voir https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes


ps a maintenant des options de sortie pour les différents types d'espaces de noms associés aux processus :ipcns , mntns , netns , pidns , userns , et utsns . Pour cette question, le pertinent est l'espace de noms PID, ou pidns .

donc si vous vouliez connaître l'identifiant de l'espace de noms PID pour, par exemple, le pid 459 :

# ps -h -o pidns -p 459
4026532661

et pour lister tous les processus dans cet espace de noms :

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

ou avec pgrep , vous pouvez passer directement d'un PID à une liste de tous les processus partageant le même espace de noms PID :

pgrep -a --ns 459

Contrairement à ps , pgrep peut limiter la sortie à un espace de noms spécifique (si vous connaissez le PID de l'un des processus qu'il contient), mais a des capacités de formatage de sortie très limitées (PID uniquement, ou PID et leurs lignes de commande)

Vous pouvez toujours rediriger la sortie de pgrep --ns 459 à xargs ps -f cependant pour récupérer les informations dont vous avez besoin sur le processus.


Linux
  1. Comment puis-je savoir quel processus a un verrou sur un fichier sous Linux ?

  2. Comment trouver tous les processus enfants ?

  3. Comment détecter et découvrir qu'un programme est dans l'impasse ?

  4. Comment savoir quel processus utilise un fichier sous Linux ?

  5. Comment savoir de quelles capacités Linux un processus a besoin pour fonctionner ?

3 façons de savoir quel processus écoute sur un port particulier

Comment savoir depuis combien de temps un processus s'exécute sous Linux

Comment trouver quel service écoute sur un port particulier

Comment tuer le processus Linux en cours d'exécution sur un port particulier

Linux - Comment trouver l'espace de noms d'un processus particulier ?

Comment trouver le nom du processus à partir de son PID