GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo averiguar el espacio de nombres de un proceso en particular?

Intentaré responder tanto a esta como a su pregunta anterior, ya que están relacionadas.

Las puertas a los espacios de nombres son archivos en /proc/*/ns/* y /proc/*/task/*/ns/* .

Un espacio de nombres es creado por un proceso dejar de compartir su espacio de nombres. Luego, un espacio de nombres se puede hacer permanente mediante bind-mounting el ns archivo a algún otro lugar.

Eso es lo que ip netns hace por ejemplo para net espacios de nombres Deja de compartir su net espacio de nombres y montajes de enlace /proc/self/ns/net a /run/netns/netns-name .

En un /proc montado en el espacio de nombres del pid raíz, puede enumerar todos los espacios de nombres que tienen un proceso haciendo lo siguiente:

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

El número entre corchetes es el número de inodo.

Para obtener eso para un proceso dado:

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

Ahora, puede haber permanente espacios de nombres que no tienen ningún proceso en ellos. Descubrirlos puede ser mucho más complicado AFAICT.

En primer lugar, hay que tener en cuenta que puede haber varios montaje espacios de nombres.

# 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

Esos /mnt/1/a , /run/netns/a pueden ser archivos de espacio de nombres.

Podemos obtener un número de inodo:

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

Pero eso no nos dice mucho más que no está en la lista calculada arriba.

Podemos intentar introducirlo como cualquiera de los diferentes tipos:

# 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
#

Bien, eso fue un net archivo de espacio de nombres.

Así que parecería que tenemos un método para listar los espacios de nombres:list the ns directorios de todas las tareas, luego busque todos los proc puntos de montaje en todos los /proc/*/task/*/mountinfo y descubra su tipo tratando de ingresarlos.


Si tiene util-linux v2.28 o superior puedes usar 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

Corrección:lsns no está disponible en util-linux v2.27 como solía decir esta respuesta. Consulte https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes


ps ahora tiene opciones de salida para los diferentes tipos de espacios de nombres asociados con los procesos:ipcns , mntns , netns , pidns , userns y utsns . Para esta pregunta, la relevante es el espacio de nombres PID, o pidns .

por lo tanto, si desea averiguar la identificación del espacio de nombres PID para, por ejemplo, pid 459:

# ps -h -o pidns -p 459
4026532661

y para listar todos los procesos en ese espacio de nombres:

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

o con pgrep , puede pasar directamente de un PID a una lista de todos los procesos que comparten el mismo espacio de nombres de PID:

pgrep -a --ns 459

A diferencia de ps , pgrep puede limitar la salida a un espacio de nombres específico (si conoce el PID de uno de los procesos que contiene), pero tiene capacidades de formato de salida muy limitadas (solo PID o PID y sus líneas de comando)

Siempre puede canalizar la salida de pgrep --ns 459 a xargs ps -f aunque para recuperar la información que necesita sobre el proceso.


Linux
  1. Debian:¿cómo averiguar cómo se instaló un paquete en particular?

  2. ¿Cómo averiguo qué proceso tiene un bloqueo en un archivo en Linux?

  3. ¿Cómo detectar y descubrir que un programa está en interbloqueo?

  4. Cómo averiguar qué archivo está en un sector en particular

  5. ¿Cómo encontrar la cadena ancestral de un proceso?

3 formas de averiguar qué proceso está escuchando en un puerto en particular

Cómo saber cuánto tiempo ha estado ejecutándose un proceso en Linux

Cómo encontrar qué servicio está escuchando en un puerto en particular

Cómo matar el proceso de ejecución de Linux en un puerto particular

Cómo encontrar el nombre del proceso a partir de su PID

¿Cómo puedo averiguar qué sistema operativo de servidor está ejecutando un sitio en particular?