GNU/Linux >> Tutoriels Linux >  >> Linux

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

J'ai déjà posé une question sur la façon de lister tous les espaces de noms sous Linux, mais il n'y avait pas de réponses correctes et exactes, donc je veux trouver une méthode qui peut m'aider à trouver l'espace de noms de PID d'un processus ou d'un groupe de processus. Comment cela peut-il être fait sous Linux ?

Réponse acceptée :

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 vers /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 :lister 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.

En relation:KSS - Linux Shell 1 Cheat Sheet
Linux
  1. Comment trouver la liste de tous les ports ouverts sous Linux

  2. Comment trouver et tuer le processus Zombie sous Linux

  3. 4 façons de trouver un cœur de processeur qui exécute un processus particulier sous Linux

  4. Comment tuer un processus en cours d'exécution sur un port particulier sous Linux ?

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

Comment trouver la version du noyau Linux en cours d'exécution sur votre PC

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

Comment trouver une adresse IP sous Linux

Comment trouver le nom d'hôte sous Linux

Comment savoir à quels groupes un utilisateur appartient sous Linux

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