ইউনিক্সে একটি চলমান প্রক্রিয়া পরিবেশগত পরিবর্তনশীল?


230

আমাকে ইউনিক্স সিস্টেমে পরিবেশের ভেরিয়েবল সম্পর্কিত কিছু সমস্যা সমাধান করতে হবে।

উইন্ডোজে, আমি নির্দিষ্ট একটি প্রক্রিয়া নির্বাচন করতে এবং প্রতিটি পরিবেশের ভেরিয়েবলের মান দেখতে প্রসেসএক্সপ্লোরারের মতো একটি সরঞ্জাম ব্যবহার করতে পারি।

আমি কীভাবে ইউনিক্সে একই জিনিসটি সম্পাদন করতে পারি? echoingএবং envসেমিডিআর বর্তমান সময়ে মানগুলি দেখায় তবে চলমান প্রক্রিয়াটি বর্তমানে কী ব্যবহার করছে তা আমি দেখতে চাই।


2
যদিও / proc / <pid> / এনভায়রনমেন্টের 0 টি আকার রয়েছে, এখনও সেখানে তথ্য রয়েছে। "আপনি যদি কার্নেলের মধ্যে উইন্ডো হিসাবে ভাবেন তবে এটি আরও অর্থবোধ করে। [উত্স ]
nevets1219

উত্তর:


295
cat /proc/<pid>/environ

আপনি যদি প্রদত্ত কোন চলমান এক্সিকিউটেবলের পিড (গুলি) রাখতে চান তবে আপনি বেশ কয়েকটি অন্যান্য সম্ভাবনার মধ্যে ব্যবহার করতে পারেন pidof:

AlberT$ pidof sshd   
30690 6512 

সম্পাদনা :

আরও পাঠযোগ্য আউটপুট অর্জনের জন্য আমি ডেনিস উইলিয়ামসন এবং টেডি মন্তব্যগুলিকে সম্পূর্ণ উদ্ধৃত করেছি । আমার সমাধানটি নিম্নলিখিত:

tr '\0' '\n' < /proc/<pid>/environ

46
এটিকে পঠনযোগ্য করে তোলার জন্য নালগুলি নতুন লাইনে রূপান্তর করুন:cat /proc/17330/environ | tr \\0 \\n
ডেনিস উইলিয়ামসন

32
আমি সর্বদা করিxargs --null --max-args=1 echo < /proc/PID/environ
টেডি

7
তার ব্যবহার ভাল স্ট্রিং। বিড়ালটি এখনও দ্রুত :-)
নিখিল মুলি

2
পুরো /procফাইল সিস্টেমটি পোর্টেবল নয়।
ড্যানিয়েল এইচ

6
xargsনালাগুলিকে নতুন লাইনে রূপান্তর করতে কেন ব্যবহারের চেয়ে ভাল তা আমি বুঝতে পারি না tr। কেউ কি আমার জন্য এটি রাখতে পারেন? ধন্যবাদ।
জোনাথন হার্টলি

61

যেহেতু এই প্রশ্নের একটি ইউনিক্স ট্যাগ রয়েছে এবং অন্য প্রত্যেকে লিনাক্স ট্যাগকে সম্বোধন করার মতো দুর্দান্ত কাজ করেছে , আপনি ওএস এক্স এবং বিএসডি-প্রাপ্ত অন্যান্য সিস্টেমে এই তথ্যটি পেতে পারেন

ps -p <PID> -wwwe

অথবা

ps -p <PID> -wwwE

এবং সোলারিসের সাথে

/usr/ucb/ps -wwwe <PID>

/procআপনি যদি অস্পষ্ট psকমন্ড মনে রাখতে না চান তবে সোলারিসও ডিরেক্টরিটি সমর্থন করে ।


3
দ্বিতীয়টি PS -p <PID> -www OS X 10.6 এ রান করুন আমি সমস্ত চলমান প্রক্রিয়ার তালিকা পেয়েছি। ডান কমান্ডটি হ'ল ই- ফ্ল্যাগ সহ ।
drAlberT

1
আমি ওএস এক্স 10.4 এ পরীক্ষা করেছি, তবে 10.5 নয়। সেই অনুযায়ী আপডেট হয়েছে।
জেরাল্ড কম্বস

4
এটি নিখুঁত নয়। -E বিকল্পটি কেবল প্রাথমিক পরিবেশের ভেরিয়েবলের প্রতিবেদন করে । চলমান প্রক্রিয়া নিজেই যদি ভেরিয়েবলগুলি পরিবর্তন করা হয় (যেমন, পসেক্স পুটেনভ () ফাংশন ব্যবহারের মাধ্যমে), এর ফলাফলগুলি আউটপুটগুলিতে প্রতিফলিত হয় না ps -p <PID> -wwE
কাল

1
আপনার মালিকানাধীন নয় এমন প্রক্রিয়াগুলির এনভ ভার্সগুলি না দেখানো পছন্দসই বৈশিষ্ট্যের মতো মনে হচ্ছে। এটি @ ড্রএলবার্টের লিনাক্স-ভিত্তিক উত্তর ব্যবহারের ক্ষেত্রেও /proc/PID/environ। এই ফাইলগুলি কেবল প্রক্রিয়াটির মালিকের দ্বারা পঠনযোগ্য।
জোনাথন হার্টলি

1
@ ইয়ানি এটি সম্ভব তবে এটি আরও শক্ত, এটি চলমান প্রক্রিয়াটিতে একটি ডিবাগার সংযুক্ত করা প্রয়োজন। এই উত্তরটি দেখুন: unix.stackexchange.com/a/70636
কাল

25

অন্যরা যেমন বলেছে, লিনাক্সে, আপনি / প্রোকে দেখতে পারেন তবে আপনার কার্নেল সংস্করণের উপর নির্ভর করে এক বা দুটি সীমা রয়েছে:

প্রথমত, এনভায়রনমেন্ট ফাইলটি পরিবেশটি এমনভাবে ধারণ করে যা দেখে মনে হয় প্রক্রিয়াটি তৈরি হয়েছিল। তার মানে এই যে প্রক্রিয়াটি তার পরিবেশে যে পরিবর্তন করেছে সেগুলি / প্রোকে প্রদর্শিত হবে না:

$ cat /proc/$$/environ | wc -c
320
$ bash
$ cat /proc/$$/environ | wc -c
1270
$ 

প্রথম শেলটি একটি লগইন শেল এবং প্রাথমিকভাবে খুব সীমিত পরিবেশ থাকে তবে এটি সোর্সিং দ্বারা বৃদ্ধি করে। দ্বিতীয় শেলটি শুরু থেকেই বৃহত্তর পরিবেশের উত্তরাধিকার সূত্রে আসে, এটি এটি কেন / প্রোকে দেখায়।

এছাড়াও, পুরানো কার্নেলগুলিতে, এনভায়রনমেন্ট ফাইলের বিষয়বস্তুগুলি একটি পৃষ্ঠার আকার (4K) এর মধ্যে সীমাবদ্ধ রয়েছে:

$ cat /proc/$$/environ | wc -c
4096
$ env | wc -c
10343
$ 

কোথাও 2.6.9 (RHEL4) এবং 2.6.18 (RHEL5) এর মধ্যে এই সীমাটি সরানো হয়েছে ...


1
প্রক্রিয়াটি প্রসারিত হওয়ার পরে সেট করা যে কোনও দূরবর্তী প্রক্রিয়ার পরিবেশগত পরিবর্তনগুলি পাওয়া সম্ভব? আমি বুঝতে পারি ভিএফএসে, এটি / প্রোক / স্ব / এনভায়রনমেন্ট সহ প্রদর্শিত হয় তবে কেবল যদি আমরা প্রক্রিয়াটির ভিতরে থাকি। তবে কীভাবে এটি একটি দূরবর্তী প্রক্রিয়ার জন্য পাবেন?
জিপি

11

এটি করার জন্য বিএসডি বিকল্পগুলির সঠিক ব্যবহার (কমপক্ষে লিনাক্সে):

ps e $pid

অথবা

ps auxe  #for all processes

এবং হ্যাঁ, পিএস ম্যানপেজটি বেশ বিভ্রান্তিকর। ( মাধ্যমে )


আমার উবুন্টু পরিবেশের ভেরিয়েবলগুলি ঠিক কমান্ড লাইনের বিপরীতে টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করে এমনকি তাদের মধ্যে ফাঁকা জায়গা ছাড়াও টার্মিনাল উইন্ডোর এক লাইনে ছিন্ন করে। আমি ps eww $pidদ্বিতীয় সমস্যাটি সমাধান পেয়েছি ।
ব্যবহারকারী 18911

1
@ ইউজার 18911: এনভির ভার্সে শূন্য চরিত্রের বিভাজক রয়েছে। এই পৃষ্ঠার অন্যান্য উত্তরগুলি পঠনযোগ্যতার জন্য এগুলিকে ব্যবহার করতে xargsবা trনতুন লাইনে রূপান্তর করার উপায় দেখায় । মধ্যবর্তী চার বছরে আপনি সম্ভবত এটি উপলব্ধি করেছেন।
জোনাথন হার্টলি

7
cat /proc/PID/environ

আপনি দেখতে চান প্রক্রিয়াটির পিআইডি দিয়ে পিআইডি প্রতিস্থাপন করুন। একটি চলমান প্রক্রিয়া সম্পর্কে প্রতিটি তথ্য / proc / PID / ডিরেক্টরি অধীনে

উদাহরণস্বরূপ: cat / proc / 32512 / এনভায়রনমেন্ট


7

আর্চলিনাক্স উইকি থেকে নেওয়া :

মানগুলিকে পার্স করার জন্য আপনি একটি অস্থায়ী ফাংশন তৈরি করতে পারেন /proc/<pid>/environ। টার্মিনাল প্রম্পটে:

envof() { sed 's/\x0/\n/g' /proc/${1}/environ; }

তারপরে আপনি যে প্রক্রিয়াটি চান তার পিড দিয়ে কেবল ব্যবহার করুন:

envof <pid>

6

লিনাক্সের অধীনে, আমি একবার দেখার চেষ্টা করব

/proc/<pid>/environ


5

অপ্রত্যাশিতভাবে নথিভুক্ত করার সময়, বিষয়বস্তুগুলিতে /proc/<pid>/environপ্রক্রিয়াটি শুরু করতে ব্যবহৃত পরিবেশ কেবল থাকবে।

আপনার যদি কোনও প্রক্রিয়া 'পরিবেশের বর্তমান অবস্থা পরিদর্শন করতে হয় তবে তা করার একটি উপায় হ'ল ব্যবহার করে gdb

# Start gdb by attaching it to a pid or core file
gdb <executable-file> <pid or core file>

# Run the following script to dump the environment
set variable $foo = (char **) environ
set $i = 0
while ($foo[$i] != 0)
print $foo[$i++]
end

3

এবং যেহেতু আমার কাজ আমাকে এআইএক্স ফ্যান বয় করে তোলে, তাই আমাদের ভুলে যাওয়া উচিত নয়:

ps eww [pid]

বা ম্যান পেজ যেমন এটি বলে, "বার্কলে স্ট্যান্ডার্ডস"।

যে কারণেই হোক না কেন, / প্রক / পিআইডি / পরিবেশ এআইএক্স-তে বিদ্যমান নেই।


2

যদি আপনি envএকটি স্বেচ্ছাসেবী প্রক্রিয়া (পিআইডি) এর জন্য পরিবেশের ভেরিয়েবলগুলির আউটপুট যেমন ফর্ম্যাট তৈরি করতে চান তবে আপনি একটি সুবিধাজনক বাশ penv <pid>কমান্ড (আপনার ওএসের জন্য উপযুক্ত) তৈরি করতে এবং এটিতে যুক্ত করতে পারেন .bashrc:

লিনাক্স এটি আপনার ~ / .bashrc এ যুক্ত করে:

penv () { 
    xargs --null --max-args=1 < /proc/$1/environ
}

ম্যাকোস / বিএসডি এটি আপনার ~ / .bashrc এ যুক্ত করুন:

penv() {
   ps eww -o command $1  | tr ' ' '\n'
}

সোলারিস এটি আপনার ~ / .bashrc এ যুক্ত করুন:

penv() {
   pargs -e $1
}

ব্যবহার:

$ উত্স $ হোম / .bashrc
g pgrep VBoxSVC
10268
$ পেনভ 10268
এসএসএইচ_কনএনশন = 1.1.1.242 53960 1.1.1.91 22
GREP_COLORS = SL = 49; 39: CX = 49; 39: MT = 49; 38; 5; 167; 1: FN = 49; 39; 1: Ln = 49; 39: বাংলা ভাষায় = 49; 39: SE = 50; 39
Lang = en_US.UTF -8
বিকিরণকারী = তেজ
XDG_SESSION_ID = 106
USER কে = রুট
গণপূর্ত বিভাগের = / রুট
হোম = / রুট
এসএসএইচ_সিএলআইএনটি = 1.1.1.242 53960 22
SSH_TTY = আপনার / dev / পয়েন্ট / 3
মেল = প্রথমেই / var / মেল / রুট
শব্দটি = xterm-256color
শেল = / বিন / ব্যাশ
SHLVL = 1
LOGNAME = রুট
DBUS_SESSION_BUS_ADDRESS = UNIX: পাথ = / রান / ব্যবহারকারী / 0 / বাস
XDG_RUNTIME_DIR = / রান / ব্যবহারকারী / 0
পাথ = / রুট / বিন: / বিন: পক্ষ থেকে / sbin / usr / বিন: / usr / sbin / usr / স্থানীয় / বিন / usr / স্থানীয় পক্ষ থেকে / sbin :.
VBOX_LOG_FLAGS = থ্রেড tsc
VBOX_LOG = বাইরের + + dev_vmm_backdoor.elf + + dev_vmm.elf

0

একটি ম্যাক সমাধান, সম্ভবত অন্যান্য বিএসডিও এর মতো হতে পারে

pid=28369; ps e $pid | cut -c$(expr 1 + $(ps p $pid|tail +2|wc -c))-

এনভায়রনমেন্ট ভেরিয়েবলগুলি কমান্ড লাইনে যুক্ত হয়, এটি কমান্ড লাইনটি সরিয়ে দেয় এবং আমাদের কাছে কেবল পরিবেশের ভেরিয়েবলগুলি অবশিষ্ট থাকে।

এটি নিখুঁত নয় কারণ এগুলি এলএফ দ্বারা আলাদা নয় space


-1

জন্য / proc / PID, / পরিবেশ

এর জন্য, প্রথমে আমাদের প্রক্রিয়াটির পিআইডি সনাক্ত করতে হবে। এর জন্য আপনি PS কমান্ড ব্যবহার করতে পারেন

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