GNU/Linux >> Znalost Linux >  >> Linux

Jak zjistit jmenný prostor konkrétního procesu?

Pokusím se odpovědět na tuto i vaši předchozí otázku, protože spolu souvisí.

Dveře do jmenných prostorů jsou soubory v /proc/*/ns/* a /proc/*/task/*/ns/* .

Jmenný prostor je vytvořen procesem zrušení sdílení jeho jmenný prostor. Jmenný prostor lze poté učinit trvalým pomocí připojení vazby ns soubor na nějaké jiné místo.

To je to, co ip netns dělá například pro net jmenné prostory. Zruší sdílení jeho net jmenný prostor a připojení připojení /proc/self/ns/net na /run/netns/netns-name .

V /proc připojený v kořenovém jmenném prostoru pid, můžete vypsat všechny jmenné prostory, které mají v sobě proces:

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

Číslo v hranatých závorkách je číslo inodu.

Chcete-li to získat pro daný proces:

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

Nyní může existovat trvalé jmenné prostory, které v sobě nemají žádný proces. Zjistit je může být mnohem složitější AFAICT.

Nejprve musíte mít na paměti, že připojení může být několik jmenné prostory.

# 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

Těch /mnt/1/a , /run/netns/a mohou být soubory jmenného prostoru.

Můžeme získat číslo inodu:

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

Ale to nám neříká nic jiného, ​​než že to není ve výše vypočítaném seznamu.

Můžeme to zkusit zadat jako kterýkoli z různých typů:

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

Dobře, to bylo net soubor jmenného prostoru.

Zdá se tedy, že máme metodu, jak vypsat jmenné prostory:vypsat ns adresáře všech úloh a poté najděte všechny proc přípojné body ve všech /proc/*/task/*/mountinfo a zjistit jejich typ pokusem o jejich zadání.


Pokud máte util-linux v2.28 nebo vyšší můžete použít 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

Oprava:lsns není k dispozici v util-linux v2.27, jak říká tato odpověď. Viz https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes


ps nyní má výstupní možnosti pro různé typy jmenných prostorů spojených s procesy:ipcns , mntns , netns , pidns , userns a utsns . Pro tuto otázku je relevantní jmenný prostor PID neboli pidns .

takže pokud byste chtěli zjistit ID jmenného prostoru PID pro, např. pid 459:

# ps -h -o pidns -p 459
4026532661

a vypsat všechny procesy v tomto jmenném prostoru:

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

nebo pomocí pgrep , můžete přejít přímo z PID na seznam všech procesů sdílejících stejný jmenný prostor PID:

pgrep -a --ns 459

Na rozdíl od ps , pgrep může omezit výstup na konkrétní jmenný prostor (pokud znáte PID jednoho z procesů v něm), ale má velmi omezené možnosti formátování výstupu (pouze PID nebo PID a jejich příkazové řádky)

Výstup pgrep --ns 459 můžete vždy pomocí kanálu pipetovat na xargs ps -f i když k získání informací, které o procesu potřebujete.


Linux
  1. 4 způsoby, jak zjistit jádro CPU, na kterém běží konkrétní proces v Linuxu

  2. Debian – Jak zjistit, jak se nainstaloval konkrétní balíček?

  3. Jak zabít proces běžící na konkrétním portu v Linuxu?

  1. Jak najít a zabít zombie proces v Linuxu

  2. Linux – Jak zjistit jmenný prostor konkrétního procesu?

  3. Jak mohu zjistit, který operační systém serveru je na konkrétním webu spuštěn?

  1. Jak zjistím, který proces má zámek na souboru v Linuxu?

  2. Jak najít všechny podřízené procesy?

  3. Jak zjistit a zjistit, že je program v mrtvém bodě?