як дізнатись простір імен певного процесу?


25

Я вже задавав питання про те, як перелічити всі простори імен в Linux , але не було правильних і точних відповідей, тому я хочу знайти спосіб, який може допомогти мені знайти простір імен PID певного процесу чи групи процесів. Як це можна зробити в Linux?

Відповіді:


39

Я спробую відповісти і на це, і на ваше попереднє запитання, оскільки вони пов'язані.

Двері в простори імен - це файли в /proc/*/ns/*і /proc/*/task/*/ns/*.

Простір імен створюється процесом, який видаляє його простір імен. Простір імен може бути зроблено постійним, скрутне-монтажним на nsфайл в іншому місці.

Це те, що ip netnsстосується, наприклад, чистих просторів імен. Це його заборонити обмін використання netпростору імен і Bind-кріплення /proc/self/ns/netдо ./run/netns/netns-name

У /procзмонтованому просторі імен кореневого підпису ви можете перелічити всі простори імен, які мають у них процес, виконавши:

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

Число в квадратних дужках - це число індексу.

Щоб отримати це для певного процесу:

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

Тепер можуть бути постійні простори імен, у яких немає жодного процесу. Виявити їх може бути набагато складніше AFAICT.

По- перше, ви повинні мати на увазі , що там може бути кілька монтування просторів імен.

# 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

Ті /mnt/1/a, /run/netns/aможуть бути файлами простір імен.

Ми можемо отримати номер inode:

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

Але це не говорить нам багато іншого, ніж його немає у списку, обчисленому вище.

Ми можемо спробувати ввести його як будь-який із різних типів:

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

Добре, це був netфайл простору імен.

Тому, здавалося б, у нас є метод перерахування просторів імен: перерахуйте nsкаталоги всіх завдань, а потім знайдіть усі точки procмонтажу у всіх /proc/*/task/*/mountinfoта визначте їх тип, намагаючись ввести їх.


19

Якщо у вас є util-linux v2.28 або вище, ви можете використовувати 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

Виправлення: lsns недоступний у util-linux v2.27, як говорили у цій відповіді. Дивіться https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes


Також я знайшов хороший скрипт python для тих, хто має старіший Linux. opencloudblog.com/?p=251
Ніл Макгілл

lsnsдуже корисно, але він показує лише найнижчий PID у кожній області імен, тобто він не може вказати вам простір імен для будь-якого довільного PID. +1 у будь-якому випадку, оскільки це все ще корисна відповідь, навіть якщо це не відповідає безпосередньо на питання.
cas

9
$ ip netns identify $PID

де $PIDідентифікатор процесу, який ви можете отримати різними способами.

http://man7.org/linux/man-pages/man8/ip-netns.8.html


1
Зауважте, що це лише для мережевих просторів імен та лише тих, створених за допомогою ip netns(або принаймні створених за допомогою чогось, що прив'язує-монтує двері простору імен у / run / netns, як ip netnsце робиться). В основному він виглядає в / run / netns для файлів, що збігаються /proc/$PID/ns/net.
Стефан Хазелас

Що? /run/netnsнавіть не існує на моєму комп’ютері.
Кен Шарп

/run/netnsабо де завгодно ipприв’язує спеціальні файли простору імен. findmnt -t nsfsможе сказати вам, де він знаходиться у вашій системі. ОТОХ, якщо ви це зробите unshare -n sleep 1000 & ip netns identify "$!", ви нічого не отримаєте.
Стефан Шазелас

findmnt -t nsfs- нічого. unshare -n sleep 1000 & ip netns identify "$!"- unshare: unshare failed: Операція заборонена
Ken Sharp

Для створення нових мереж потрібні привілеї суперпользователя (можливість CAP_SYS_ADMIN). findmnt -t nsfsповернення нічого не говорить про те, що у вас немає банкоматів на вашому банкоматі.
Стефан Шазелас

9

psтепер мають параметри виведення для різних типів просторів імен , пов'язаних з процесами: ipcns, mntns, netns, pidns, userns, і utsns. Для цього питання відповідним є простір імен PID, або pidns.

тому, якщо ви хочете дізнатися ідентифікатор простору імен PID для, наприклад, pid 459:

# ps -h -o pidns -p 459
4026532661

і перерахувати всі процеси в цьому просторі імен:

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

або з pgrep, ви можете перейти безпосередньо з PID до списку всіх процесів, що мають спільний простір імен PID:

pgrep -a --ns 459

На відміну від цього ps, pgrepможе обмежувати вихід певним простором імен (якщо ви знаєте PID одного з процесів у ньому), але має дуже обмежені можливості форматування вихідних даних (лише PID, або PID та їх командні рядки)

Ви завжди можете труби вихід , pgrep --ns 459щоб xargs ps -fхоча для отримання необхідної інформації про процес.


0

Простір імен-лістер :

Ви можете використовувати listns.py

Використання: ./listns.pyабо python2 listns.pyЩоб точно відповісти на це запитання, ви можете отримати результат таким чином python2 listns.py | grep $PID(замінити змінну pid)

Джерело: дзеркало github та стаття, яка належить до Ральфа Трезесяка

Мережеві простори імен :

Для мережевого простору імен ip netns identify $PIDможна використовувати.

Nsutils

Забезпечте pidnslistце повернення простору імен pid процесу

$ pidnslist -ss 8782
pid:[4026531836] 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.