GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mengetahui namespace dari proses tertentu?

Saya akan mencoba menjawab ini dan pertanyaan Anda sebelumnya karena keduanya terkait.

Pintu ke ruang nama adalah file di /proc/*/ns/* dan /proc/*/task/*/ns/* .

Namespace dibuat dengan proses unsharing ruang namanya. Namespace kemudian dapat dibuat permanen dengan bind-mounting ns file ke tempat lain.

Itulah ip netns lakukan misalnya untuk net ruang nama. Itu membatalkan pembagian net-nya namespace dan bind-mount /proc/self/ns/net ke /run/netns/netns-name .

Dalam /proc dipasang di root pid namespace, Anda dapat mencantumkan semua namespace yang memiliki proses di dalamnya dengan melakukan:

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

Angka dalam tanda kurung siku adalah nomor inode.

Untuk mendapatkannya untuk proses tertentu:

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

Sekarang, mungkin ada permanen ruang nama yang tidak memiliki proses apa pun di dalamnya. Menemukan mereka bisa menjadi AFAICT yang jauh lebih rumit.

Pertama, Anda harus ingat bahwa ada beberapa pemasangan ruang nama.

# 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 itu , /run/netns/a mungkin file namespace.

Kita bisa mendapatkan nomor inode:

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

Tapi itu tidak banyak memberi tahu kita selain tidak ada dalam daftar yang dihitung di atas.

Kami dapat mencoba dan memasukkannya sebagai salah satu dari jenis yang berbeda:

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

Oke, tadi adalah net file namespace.

Jadi sepertinya kita memiliki metode untuk mencantumkan ruang nama:daftarkan ns direktori semua tugas, lalu temukan semua proc mountpoints di semua /proc/*/task/*/mountinfo dan cari tahu tipenya dengan mencoba memasukkannya.


Jika Anda memiliki util-linux v2.28 atau lebih tinggi Anda dapat menggunakan 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

Koreksi:lsns tidak tersedia di util-linux v2.27 seperti yang biasa dikatakan oleh jawaban ini. Lihat https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes


ps sekarang memiliki opsi keluaran untuk berbagai jenis ruang nama yang terkait dengan proses:ipcns , mntns , netns , pidns , userns , dan utsns . Untuk pertanyaan ini, yang relevan adalah namespace PID, atau pidns .

jadi jika Anda ingin mengetahui id namespace PID untuk, mis., pid 459:

# ps -h -o pidns -p 459
4026532661

dan untuk membuat daftar semua proses dalam ruang nama itu:

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

atau dengan pgrep , Anda dapat langsung dari PID ke daftar semua proses yang berbagi namespace PID yang sama:

pgrep -a --ns 459

Tidak seperti ps , pgrep dapat membatasi output ke namespace tertentu (jika Anda mengetahui PID dari salah satu proses di dalamnya), tetapi memiliki kemampuan pemformatan output yang sangat terbatas (hanya PID, atau PID dan baris perintahnya)

Anda selalu dapat mem-pipe output dari pgrep --ns 459 ke xargs ps -f meskipun untuk mengambil informasi yang Anda butuhkan tentang proses tersebut.


Linux
  1. 4 Cara Mengetahui Core CPU yang menjalankan Proses tertentu di Linux

  2. Bagaimana cara mendeteksi dan mengetahui suatu program mengalami kebuntuan?

  3. Bagaimana saya bisa mengetahui OS server mana yang dijalankan oleh situs tertentu?

  1. Debian – Bagaimana Cara Mengetahui Bagaimana Sebuah Paket Terpasang Terpasang?

  2. Bagaimana cara mengetahui proses apa yang mengunci file di Linux?

  3. Bagaimana menemukan semua proses anak?

  1. Bagaimana cara mematikan proses yang berjalan pada port tertentu di Linux?

  2. Bagaimana cara mengetahui proses mana yang menggunakan file di Linux?

  3. Bagaimana cara mengetahui kemampuan linux apa yang dibutuhkan suatu proses untuk bekerja?