GNU/Linux >> Belajar Linux >  >> Linux

Linux – Bagaimana Cara Mengetahui Namespace Dari Proses Tertentu?

Saya sudah mengajukan pertanyaan tentang bagaimana membuat daftar semua ruang nama di Linux, tetapi tidak ada jawaban yang benar dan tepat, jadi saya ingin mencari metode yang dapat membantu saya untuk mengetahui ruang nama PID dari beberapa proses atau grup proses. Bagaimana itu bisa dilakukan di Linux?

Jawaban yang Diterima:

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

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

Namespace dibuat oleh proses unsharing namespace-nya. Namespace kemudian dapat dibuat permanen dengan bind-mounting ns file ke tempat lain.

Itulah ip netns lakukan misalnya untuk net ruang nama. Itu tidak membagikan net namespace dan bind-mounts /proc/self/ns/net ke /run/netns/netns-name .

Dalam /proc dipasang di namespace pid root, Anda dapat membuat daftar 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 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. Menemukannya bisa menjadi AFAICT yang jauh lebih rumit.

Pertama, Anda harus ingat bahwa mungkin ada beberapa mount 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 kami 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, itu adalah net file namespace.

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

Terkait:KSS - Lembar Cheat Linux Shell 1
Linux
  1. Cara Mengetahui Daftar Semua Port Terbuka di Linux

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

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

  1. Versi Linux Apa yang Saya Jalankan? Inilah Cara Mengetahuinya

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

  3. Bagaimana cara mengetahui namespace dari proses tertentu?

  1. Cara Menemukan dan Membunuh Proses Zombie di Linux

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

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