GNU/Linux >> Linux Esercitazione >  >> Linux

Come scoprire lo spazio dei nomi di un particolare processo?

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

Le porte ai namespace sono file in /proc/*/ns/* e /proc/*/task/*/ns/* .

Uno spazio dei nomi viene creato da un processo unsharing il suo spazio dei nomi. Uno spazio dei nomi può quindi essere reso permanente mediante il montaggio del collegamento il ns file in un altro posto.

Questo è ciò che ip netns fa ad esempio per net spazi dei nomi. Annulla la condivisione del suo net namespace e bind-mount /proc/self/ns/net a /run/netns/netns-name .

In un /proc montato nello spazio dei nomi root pid, 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 di inode.

Per ottenerlo per un dato processo:

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

Ora, potrebbero esserci permanenti spazi dei nomi che non contengono alcun processo. Trovarli può essere molto più complicato AFAICT.

Innanzitutto, devi tenere presente che possono esserci diversi mount 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 possono 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:elenca il ns directory di tutte le attività, quindi trova tutte le proc punti di montaggio in tutti i /proc/*/task/*/mountinfo e scopri il loro tipo provando a inserirli.


Se hai util-linux v2.28 o superiore puoi usare 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

Correzione:lsns non è disponibile in util-linux v2.27 come diceva questa risposta. Vedere https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes


ps ora ha opzioni di output per i diversi tipi di namespace associati ai processi:ipcns , mntns , netns , pidns , userns e utsns . Per questa domanda, quello rilevante è lo spazio dei nomi PID, o pidns .

quindi se vuoi scoprire l'ID dello spazio dei nomi PID per, ad esempio, pid 459:

# ps -h -o pidns -p 459
4026532661

e per elencare tutti i processi in quello spazio dei nomi:

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

o con pgrep , puoi passare direttamente da un PID a un elenco di tutti i processi che condividono lo stesso spazio dei nomi PID:

pgrep -a --ns 459

A differenza di ps , pgrep può limitare l'output a uno spazio dei nomi specifico (se conosci il PID di uno dei processi in esso contenuti), ma ha capacità di formattazione dell'output molto limitate (solo PID o PID e relative righe di comando)

Puoi sempre reindirizzare l'output di pgrep --ns 459 a xargs ps -f tuttavia per recuperare le informazioni necessarie sul processo.


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

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

  3. Debian – Come scoprire come è stato installato un particolare pacchetto?

  4. Come faccio a scoprire quale processo ha un blocco su un file in Linux?

  5. Come trovare tutti i processi figlio?

3 modi per scoprire quale processo è in ascolto su una porta particolare

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

Come trovare quale servizio è in ascolto su una porta particolare

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

Come trovare il nome del processo dal suo PID

Come scoprire se httpd è in esecuzione o meno tramite la riga di comando?