কিভাবে একটি নির্দিষ্ট প্রক্রিয়া নামস্থান সন্ধান করতে?


25

আমি লিনাক্সে সমস্ত নামস্থান কীভাবে তালিকাভুক্ত করব সে সম্পর্কে ইতিমধ্যে একটি প্রশ্ন জিজ্ঞাসা করেছি , তবে কোনও সঠিক এবং সঠিক উত্তর পাওয়া যায় নি, তাই আমি এমন একটি পদ্ধতি খুঁজে পেতে চাই যা কোনও প্রক্রিয়া বা গোষ্ঠীর গ্রুপের পিআইডি-র नेमস্পেস খুঁজে পেতে আমাকে সহায়তা করতে পারে প্রক্রিয়া। এটি লিনাক্সে কীভাবে করা যায়?

উত্তর:


39

আমি এটি এবং আপনার পূর্ববর্তী উভয় প্রশ্নের সাথে সম্পর্কিত হওয়ায় চেষ্টা করব এবং উত্তর দেব ।

নেমস্পেসের দরজাগুলি ফাইল /proc/*/ns/*এবং /proc/*/task/*/ns/*

একটি নেমস্পেস একটি নাম প্রক্রিয়া অসমর্থিত প্রক্রিয়া দ্বারা তৈরি করা হয় । একজন নামস্থান তারপর স্থায়ী করা যেতে পারে বেঁধে-মাউন্টns কিছু অন্যান্য জায়গা ফাইল।

নেট নেমস্পেসের ip netnsজন্য উদাহরণস্বরূপ এটি তা করে । এটি এর নাম স্থানটি ভাগ করে নাও এবং এতে বাঁধাই করে ।net/proc/self/ns/net/run/netns/netns-name

একটি /procরুট PID নামস্থানে মাউন্ট, আপনি সমস্ত নামব্যবধান করে তাদের মধ্যে একটি প্রক্রিয়া আছে তালিকাবদ্ধ করতে পারেন:

# 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

এখন, স্থায়ী নেমস্পেস থাকতে পারে যার মধ্যে কোনও প্রক্রিয়া নেই। এগুলি খুঁজে বের করা অনেক কার্যকর কৌশলযুক্ত হতে পারে A

প্রথমত, আপনাকে মনে রাখতে হবে যে এখানে বেশ কয়েকটি মাউন্ট নেমস্পেস থাকতে পারে ।

# 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

আপনার যদি ব্যবহার -লিনাক্স 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- রিলেজ নোটস দেখুন


পুরানো লিনাক্সের জন্য একটি অজগর স্ক্রিপ্টও আমি পেয়েছি। 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(বা কমপক্ষে এমন কোনও কিছু দ্বারা তৈরি করা হয়েছে যা / রান / নেট যেমন নেমস্পেসের দরজাগুলিকে আবদ্ধ ip netnsকরে তোলে )। এটি মূলত ফাইল হিসাবে একই জন্য / চালানোর / 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 "$!"- আনশয়ার: শেয়ারহীন ব্যর্থ: অপারেশন অনুমোদিত নয়
কেন শার্প

একটি নতুন নেট তৈরি করতে আপনার সুপারউজার সুবিধাগুলি (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আপনি পিআইডি থেকে একই পিআইডি নাম স্থানটি ভাগ করে নেওয়ার সমস্ত প্রক্রিয়াগুলির তালিকায় সরাসরি যেতে পারেন:

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] 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.