सवाल यूनिक्स पर चल रही प्रक्रिया के पर्यावरण चर?


मुझे यूनिक्स सिस्टम पर पर्यावरण चर से संबंधित कुछ समस्याओं का निवारण करने की आवश्यकता है।

विंडोज़ पर, मैं प्रक्रिया को चुनने के लिए ProcessExplorer जैसे टूल का उपयोग कर सकता हूं और प्रत्येक पर्यावरण चर के मानों को देख सकता हूं।

यूनिक्स पर मैं वही चीज़ कैसे पूरा कर सकता हूं? echoing तथा env cmd वर्तमान समय में मूल्य दिखाएं, लेकिन मैं देखना चाहता हूं कि चल रही प्रक्रिया वर्तमान में किस प्रकार का उपयोग कर रही है।


200
2017-09-17 18:14


मूल


भले ही / proc / <pid> / वातावरण का आकार 0 है, फिर भी वहां जानकारी है। "अगर आप इसे कर्नेल में खिड़की के रूप में सोचते हैं तो यह अधिक समझ में आता है। फ़ाइल में वास्तव में कोई डेटा नहीं होता है; यह केवल एक सूचक के रूप में कार्य करता है जहां वास्तविक प्रक्रिया जानकारी रहता है।" [स्रोत] - nevets1219


जवाब:


cat /proc/<pid>/environ

यदि आप किसी दिए गए चलने वाले निष्पादन योग्य के पिड (ओं) रखना चाहते हैं, तो आप कई अन्य संभावनाओं के बीच उपयोग कर सकते हैं pidof:

AlberT$ pidof sshd   
30690 6512 

संपादित करें:

मैं एक और अधिक पठनीय आउटपुट प्राप्त करने के लिए पूरी तरह से @ टेडी टिप्पणी उद्धृत करता हूं:

xargs --null --max-args=1 < /proc/<pid>/environ

257
2017-09-17 18:18



इसे पठनीय बनाने के लिए, नल को न्यूलाइन में परिवर्तित करें: cat /proc/17330/environ | tr \\0 \\n - Dennis Williamson
मैं हमेशा करता हॅू xargs --null --max-args=1 echo < /proc/PID/environ - Teddy
तारों का बेहतर उपयोग, इसका तेज़। बिल्ली अभी भी तेज है :-) - Nikhil Mulley
पूरा /proc फाइल सिस्टम पोर्टेबल नहीं है। - Daniel H
मुझे समझ में नहीं आता क्यों उपयोग कर रहा है xargs नल को न्यूलाइन में बदलने के लिए उपयोग करने से बेहतर है tr। क्या कोई इसे मेरे लिए बाहर रख सकता है? धन्यवाद। - Jonathan Hartley


चूंकि इस प्रश्न में एक है यूनिक्स टैग और हर किसी ने इतना अच्छा काम किया है linux टैग, आप इस जानकारी को ओएस एक्स और अन्य बीएसडी-व्युत्पन्न सिस्टम पर उपयोग कर सकते हैं

ps -p <PID> -wwwe

या

ps -p <PID> -wwwE

और सोलारिस के साथ

/usr/ucb/ps -wwwe <PID>

सोलारिस भी इसका समर्थन करता है /proc निर्देशिका अगर आप अस्पष्ट याद नहीं करना चाहते हैं ps commmand।


52
2017-09-17 20:47



मैं दौड़ता हूँ पीएस-पी <पीआईडी> -वेवे ओएस एक्स 10.6 पर मुझे सभी चल रही प्रक्रियाओं की सूची मिलती है। सही आदेश के साथ है -E झंडा, नहीं। - drAlberT
मैंने ओएस एक्स 10.4 पर परीक्षण किया, लेकिन 10.5 नहीं। तदनुसार अपडेट किया गया। - Gerald Combs
यह सही नहीं है। -ई विकल्प केवल रिपोर्ट करता है प्रारंभिक पर्यावरण चर। यदि चर चलने की प्रक्रिया द्वारा चर बदल दिया गया है (उदा। POSIX putenv () फ़ंक्शन के उपयोग के माध्यम से), परिवर्तन के आउटपुट में प्रतिबिंबित नहीं होते हैं ps -p <PID> -wwE। - Kal
आपके द्वारा स्वामित्व वाली प्रक्रियाओं के env vars को नहीं देखना एक वांछनीय विशेषता की तरह लगता है। यह @ drAlberT के लिनक्स उन्मुख उत्तर का उपयोग करने का भी मामला है /proc/PID/environ। वे फ़ाइलें केवल प्रक्रिया के मालिक द्वारा पठनीय हैं। - Jonathan Hartley
@yani यह संभव है, लेकिन यह बहुत कठिन है, इसे चलने की प्रक्रिया में डीबगर को जोड़ने की आवश्यकता है। यह जवाब देखें: unix.stackexchange.com/a/70636 - Kal


जैसा कि अन्य ने लिनक्स पर उल्लेख किया है, आप देख सकते हैं / proc लेकिन आपके कर्नेल संस्करण के आधार पर, एक या दो सीमाएं हैं:

सबसे पहले, पर्यावरण फ़ाइल में वातावरण होता है क्योंकि यह तब देखा जाता था जब प्रक्रिया उत्पन्न हुई थी। इसका मतलब यह है कि प्रक्रिया में जो भी बदलाव हो सकता है, वह उसके / पर्यावरण में दिखाई नहीं देगा:

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

पहला खोल एक लॉगिन खोल है और शुरुआत में बहुत सीमित वातावरण है लेकिन इसे सोर्सिंग द्वारा बढ़ाता है उदा। .bashrc लेकिन / proc इसे प्रतिबिंबित नहीं करता है। दूसरा खोल शुरुआत से बड़े पर्यावरण को विरासत में लेता है, जो इसे / proc में दिखाता है।

साथ ही, पुराने कर्नेल पर, पर्यावरण फ़ाइल की सामग्री पृष्ठ आकार (4K) तक ही सीमित है:

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

कहीं 2.6.9 (RHEL4) और 2.6.18 (RHEL5) के बीच इस सीमा को हटा दिया गया था ...


24
2017-10-29 11:27



क्या प्रक्रिया के बाद सेट की गई रिमोट प्रक्रिया के पर्यावरणीय चर प्राप्त करना संभव है? मैं समझता हूं कि वीएफएस पर, यह / proc / self / वातावरण के साथ दिखाया गया है, लेकिन तभी हम प्रक्रिया के अंदर हैं। लेकिन रिमोट प्रक्रिया के लिए इसे कैसे प्राप्त करें? - Jeevan Patnaik


ऐसा करने के लिए बीएसडी विकल्पों का सही उपयोग (कम से कम लिनक्स पर):

ps e $pid

या

ps auxe  #for all processes

और हाँ, पीएस मैनपेज बहुत भ्रमित है। (के जरिए)


10
2018-03-04 12:15



मेरा उबंटू कमांड लाइन के ठीक ऊपर पर्यावरण चर को तोड़ देता है, बिना उनके स्थान के जितना भी, और टर्मिनल विंडो पर एक पंक्ति तक भी छोटा हो जाता है। मुझे मिला ps eww $pid दूसरी समस्या को हल करता है। - user18911
@ user18911: env vars में एक शून्य वर्ण विभाजक है। इस पृष्ठ पर अन्य उत्तरों का उपयोग करने के तरीके दिखाते हैं xargs या tr इन्हें पठनीयता के लिए नई लाइनों में परिवर्तित करने के लिए। आपको शायद चार वर्षों में हस्तक्षेप में यह एहसास हुआ। - Jonathan Hartley


cat /proc/PID/environ

उस प्रक्रिया के पीआईडी ​​के साथ पीआईडी ​​को प्रतिस्थापित करें जिसे आप देखना चाहते हैं। चल रही प्रक्रिया के बारे में हर जानकारी / proc / pID / निर्देशिका के अंतर्गत है

उदाहरण: बिल्ली / proc / 32512 / वातावरण


7
2017-09-17 18:19





लिनक्स के तहत, मैं एक नज़र डालने की कोशिश करता हूं

/proc/<pid>/environ

6
2017-09-17 18:19





से लिया गया आर्कलिनक्स विकी:

आप मानों को पार्स करने के लिए एक अस्थायी फ़ंक्शन बना सकते हैं /proc/<pid>/environ। टर्मिनल प्रॉम्प्ट पर:

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

फिर अपनी इच्छित प्रक्रिया के ढक्कन के साथ, बस उपयोग करें:

envof <pid>

6
2018-01-13 23:05





Solaris 5.10 के लिए, यह काम करता है:

pargs -e <PID>

4
2017-08-08 10:04





और चूंकि मेरा काम मुझे एईक्स प्रशंसक लड़का बनाता है, इसलिए हमें मत भूलना चाहिए:

ps eww [pid]

या जैसा कि मैन पेज इसे कॉल करता है, "बर्कले स्टैंडर्ड"।

किसी भी कारण से, / proc / pID / वातावरण AIX में मौजूद नहीं है।


3
2018-01-19 15:03





जबकि बदले में दस्तावेज, सामग्री की /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
2018-02-13 16:22





एक मैक समाधान, शायद अन्य बीएसडी भी कुछ ऐसा हो सकता है

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

पर्यावरण चर को कमांड लाइन में जोड़ा जाता है, यह कमांड लाइन को हटा देता है और हमारे पास केवल पर्यावरण चर शेष हैं।

यह सही नहीं है क्योंकि वे अलग-अलग जगह अलग-अलग एलएफ अलग नहीं हैं


0
2018-06-22 06:17