किसी विशेष प्रक्रिया के नाम स्थान का पता कैसे लगाएं?


25

मैंने पहले से ही लिनक्स में सभी नामस्थानों को सूचीबद्ध करने के बारे में एक प्रश्न पूछा था, लेकिन कोई सही और सटीक उत्तर नहीं था, इसलिए मैं एक ऐसी विधि का पता लगाना चाहता हूं जो मुझे किसी प्रक्रिया या समूह के पीआईडी ​​के नाम स्थान का पता लगाने में मदद कर सके। प्रक्रियाओं। यह लिनक्स में कैसे किया जा सकता है?

जवाबों:


39

मैं कोशिश करूंगा और यह और आपके पहले के प्रश्न दोनों का उत्तर दूंगा क्योंकि वे संबंधित हैं।

नामस्थान के लिए दरवाजे में फ़ाइलें हैं /proc/*/ns/*और /proc/*/task/*/ns/*

एक नेमस्पेस एक प्रक्रिया द्वारा बनाया जाता है, जो अपने नेमस्पेस को अनचाहे बनाता है। एक नाम स्थान तब तक स्थायी बनाया जा सकता है बाँध-बढ़तेns कुछ अन्य जगह पर फ़ाइल।

ip netnsउदाहरण के लिए नेट नेमस्पेस के लिए यही है । यह अपने netनेमस्पेस और बाइंड-माउंट्स /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नामस्थान फ़ाइलें हो सकती हैं।

हम एक इनकोड संख्या प्राप्त कर सकते हैं:

# 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 यूज़-लिनेक्स v2.27 में उपलब्ध नहीं है क्योंकि यह उत्तर कहता था। Https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes देखें


वहाँ भी एक अच्छा अजगर स्क्रिप्ट मुझे मिला है, पुराने linux पर उन लोगों के लिए। opencloudblog.com/?p=251
नील मैकगिल

lsnsबहुत उपयोगी है, लेकिन यह केवल प्रत्येक नामस्थान में सबसे कम पीआईडी ​​दिखाता है - अर्थात यह आपको किसी भी मनमाने ढंग से पीआईडी ​​के लिए नामस्थान नहीं बता सकता है। वैसे भी +1 क्योंकि यह अभी भी एक उपयोगी जवाब है, भले ही यह सीधे सवाल का जवाब न दे।
कैस

9
$ ip netns identify $PID

$PIDप्रक्रिया की प्रक्रिया आईडी कहां है, जिसे आप विभिन्न तरीकों से प्राप्त कर सकते हैं।

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


1
ध्यान दें कि यह केवल नेटवर्क नेमस्पेस और केवल उपयोग करने वालों के लिए है ip netns(या कम से कम किसी ऐसी चीज से बनाया गया है, जो नेमस्पेस के दरवाजों को / run / netns में बाइंड-माउंट ip netnsकरता है)। यह मूल रूप से फ़ाइलों के लिए / रन / नेटन्स में दिखता है जो समान हैं /proc/$PID/ns/net
स्टीफन चेज़लस

क्या? /run/netnsमेरे कंप्यूटर पर भी मौजूद नहीं है।
केन शार्प

/run/netnsया जहाँ भी ipनाम-स्थान विशेष फ़ाइलों को बाँधता है। findmnt -t nsfsआपको बता सकता है कि यह आपके सिस्टम में कहां है। OTOH, यदि आप करते हैं, तो आपको unshare -n sleep 1000 & ip netns identify "$!"कुछ भी नहीं मिलेगा।
स्टीफन चेज़लस

findmnt -t nsfs- कुछ भी तो नहीं। unshare -n sleep 1000 & ip netns identify "$!"- अनिश्चित: अनिश्चित विफल: ऑपरेशन की अनुमति नहीं
केन तीव्र

एक नया जाल बनाने के लिए आपको सुपरसुसर विशेषाधिकारों (CAP_SYS_ADMIN क्षमता) की आवश्यकता होती है। findmnt -t nsfsकुछ भी नहीं देने से पता चलता है कि आपके पास अपने मशीन एटीएम पर कोई जाल नहीं है।
स्टीफन चेज़लस

9

psअब की प्रक्रिया से जुड़ी नामस्थान के विभिन्न प्रकार के उत्पादन विकल्प हैं: ipcns, mntns, netns, pidns, userns, और utsns। इस प्रश्न के लिए, प्रासंगिक पीआईडी ​​नाम स्थान है, या pidns

इसलिए यदि आप पीआईडी ​​नेमस्पेस आईडी का पता लगाना चाहते हैं, जैसे, पीआईडी ​​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आउटपुट को एक विशिष्ट नामस्थान तक सीमित कर सकता है (यदि आप इसमें किसी एक प्रक्रिया के पीआईडी ​​को जानते हैं), लेकिन बहुत सीमित आउटपुट स्वरूपण क्षमताएं (केवल पीआईडी, या पीआईडी ​​और उनकी कमांड लाइन हैं)

आप हमेशा प्रक्रिया के बारे में आवश्यक जानकारी प्राप्त करने के pgrep --ns 459लिए xargs ps -fहालांकि आउटपुट को पाइप कर सकते हैं ।


0

नेमस्पेस-लिस्टर :

आप listns.py का उपयोग कर सकते हैं

उपयोग: ./listns.pyया python2 listns.pyइस प्रश्न का सटीक उत्तर देने के लिए, आप परिणाम को इस तरह से मिटा सकते हैं python2 listns.py | grep $PID(पीड चर को बदलें)

स्रोत: गिटब-मिरर और लेख का श्रेय राल्फ त्रेसीक को दिया जाता है

नेटवर्क नामस्थान :

नेटवर्क नेमस्पेस के ip netns identify $PIDलिए इस्तेमाल किया जा सकता है।

Nsutils

प्रदान करें pidnslistकि किसी प्रक्रिया के pid नाम स्थान को वापस करें

$ pidnslist -ss 8782
pid:[4026531836] 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.