GNU/Linux >> Linux Esercitazione >  >> Linux

Linux:come scoprire lo spazio dei nomi di un particolare processo?

Ho già posto una domanda su come elencare tutti gli spazi dei nomi in Linux, ma non c'erano risposte corrette ed esatte, quindi voglio scoprire un metodo che può aiutarmi a scoprire lo spazio dei nomi del PID di alcuni processi o gruppi di processi. Come si può fare in Linux?

Risposta accettata:

Proverò a rispondere sia a questa che alla tua precedente domanda poiché sono correlate.

Le porte degli spazi dei nomi sono file in /proc/*/ns/* e /proc/*/task/*/ns/* .

Uno spazio dei nomi viene creato da un processo di annullamento della condivisione il suo spazio dei nomi. Uno spazio dei nomi può quindi essere reso permanente mediante montaggio vincolato il ns file in un altro posto.

Ecco cosa ip netns fa ad esempio per net spazi dei nomi. Annulla la condivisione della sua net namespace e bind-mount /proc/self/ns/net a /run/netns/netns-name .

In un /proc montato nello spazio dei nomi pid radice, puoi elencare tutti gli spazi dei nomi che contengono un processo facendo:

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

Il numero tra parentesi quadre è il numero dell'inode.

Per ottenerlo per un determinato processo:

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

Ora, potrebbero esserci permanenti namespace che non contengono alcun processo. Scoprirli può essere molto più complicato AFAICT.

Innanzitutto, devi tenere a mente che possono esserci diversi monte spazi dei nomi.

# 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

Quelli /mnt/1/a , /run/netns/a potrebbero essere file dello spazio dei nomi.

Possiamo ottenere un numero di inode:

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

Ma questo non ci dice molto a parte il fatto che non è nell'elenco calcolato sopra.

Possiamo provare a inserirlo come uno qualsiasi dei diversi tipi:

# 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, quello era un net file dello spazio dei nomi.

Quindi sembrerebbe che abbiamo un metodo per elencare gli spazi dei nomi:list the ns directory di tutte le attività, quindi trova tutti i proc mountpoint in tutti i /proc/*/task/*/mountinfo e scopri il loro tipo provando a inserirli.

Correlati:KSS - Cheat Sheet di Linux Shell 1
Linux
  1. Come scoprire l'elenco di tutte le porte aperte in Linux

  2. Quale versione di Linux sto eseguendo? Ecco come scoprirlo

  3. 4 modi per scoprire un core della CPU che esegue un particolare processo in Linux

  4. Come uccidere un processo in esecuzione su una particolare porta in Linux?

  5. Come scoprire quali funzionalità Linux richiede un processo per funzionare?

Come scoprire la versione del kernel Linux in esecuzione sul tuo PC

Come scoprire da quanto tempo è in esecuzione un processo in Linux

Come trovare l'indirizzo IP in Linux

Come trovare il nome host in Linux

Come scoprire a quali gruppi appartiene un utente in Linux

Come eliminare l'esecuzione del processo Linux su una porta particolare