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


230

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

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

मैं यूनिक्स पर एक ही बात को कैसे पूरा कर सकता हूं? echoingऔर envcmd सिर्फ वर्तमान समय में मान दिखाती हैं, लेकिन मैं क्या महत्व देता चल प्रक्रिया वर्तमान में उपयोग कर रहा है देखना चाहते।


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

जवाबों:


295
cat /proc/<pid>/environ

यदि आप किसी अन्य चल रही संभावनाओं के बीच किसी दिए गए निष्पादन योग्य के pid (s) करना चाहते हैं, तो उपयोग करें 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
मुझे समझ नहीं आ रहा है कि xargsnulls को newlines में बदलने के लिए उपयोग करने से बेहतर क्यों है tr। क्या कोई मेरे लिए इसे बिछा सकता है? धन्यवाद।
जोनाथन हार्टले

61

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

ps -p <PID> -wwwe

या

ps -p <PID> -wwwE

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

/usr/ucb/ps -wwwe <PID>

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


3
II रन ps -p <PID> -Wwe पर OS X 10.6 मुझे सभी रनिंग प्रक्रियाओं की सूची मिलती है। सही कमांड ई- ध्वज के साथ है , न-ई के साथ।
drAlberT

1
मैंने ओएस एक्स 10.4 पर परीक्षण किया, लेकिन 10.5 नहीं। तदनुसार अद्यतन किया गया।
गेराल्ड 15:18

4
यह सही नहीं है। -E विकल्प केवल प्रारंभिक पर्यावरण चर की रिपोर्ट करता है । यदि चर को चल रही प्रक्रिया द्वारा स्वयं ही बदल दिया गया है (जैसे POSIX putenv () फ़ंक्शन के उपयोग के माध्यम से), तो इसके आउटपुट में परिवर्तन प्रतिबिंबित नहीं होते हैं ps -p <PID> -wwE
काल

1
आपके द्वारा स्वामित्व वाली प्रक्रियाओं की env var को न देखना एक वांछनीय विशेषता की तरह लगता है। यह @ drAlberT के लिनक्स-उन्मुख उत्तर का उपयोग करने के लिए भी मामला है /proc/PID/environ। वे फाइलें केवल प्रक्रिया के स्वामी द्वारा पठनीय हैं।
जोनाथन हार्टले

1
@ यानि यह संभव है, लेकिन यह बहुत कठिन है, इसे डिबगर को चलाने की प्रक्रिया में संलग्न करना आवश्यक है। इस उत्तर को देखें: unix.stackexchange.com/a/70636
Kal

25

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

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

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

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

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

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

2.6.9 (आरएचईएल 4) और 2.6.18 (आरएचईएल 5) के बीच यह सीमा हटा दी गई ...


1
क्या एक दूरस्थ प्रक्रिया के पर्यावरणीय चर को प्राप्त करना संभव है जिसे प्रक्रिया के बाद निर्धारित किया गया है? मैं समझता हूं कि वीएफएस पर, इसे / proc / self / environ के साथ दिखाया गया है, लेकिन केवल अगर हम प्रक्रिया के अंदर हैं। लेकिन दूरस्थ प्रक्रिया के लिए इसे कैसे प्राप्त करें?
GP92

11

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

ps e $pid

या

ps auxe  #for all processes

और हाँ, पीएस मैनपेज काफी भ्रामक है। (के माध्यम से )


मेरा उबंटू कमांड लाइन के खिलाफ पर्यावरण चर को नष्ट कर देता है, यहां तक ​​कि उन दोनों के बीच एक स्थान के बिना भी, और टर्मिनल विंडो पर एक पंक्ति में भी छोटा हो जाता है। मैंने पाया ps eww $pidकि 2 समस्या को हल करता है।
user18911

1
@ user18911: env var में एक अशक्त वर्ण विभाजक है। इस पृष्ठ पर अन्य उत्तर पठनीयता के लिए इनका उपयोग करने xargsया trइन्हें नई-नई सूचियों में बदलने के तरीके दिखाते हैं । आपको शायद चार साल के अंतराल में इसका एहसास हुआ।
जोनाथन हार्टले

7
cat /proc/PID/environ

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

उदाहरण: कैट / प्रोक / 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

और जब से मेरी नौकरी मुझे AIX प्रशंसक लड़का बनाती है, तो हमें मत भूलना:

ps eww [pid]

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

जो भी कारण के लिए, AIX में / proc / PID / environ मौजूद नहीं है।


2

यदि आप envएक मनमानी प्रक्रिया (PID) के लिए पर्यावरण चर के आउटपुट की तरह स्वरूपित बनाना चाहते हैं , तो आप एक सुविधाजनक बैश penv <pid>कमांड बना सकते हैं (अपने OS के अनुरूप) और इसे अपने में जोड़ें .bashrc:

लिनक्स इसे अपने ~ / .bashrc में जोड़ें:

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

macOS / BSD इसे अपने ~ / .bashrc में जोड़ें:

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

सोलारिस इसे अपने ~ / .bashrc में जोड़ते हैं:

penv() {
   pargs -e $1
}

उपयोग:

$ स्रोत $ HOME / .bashrc
$ pgrep VBoxSVC
10,268
$ पेनव 10268
SSH_CONNECTION = 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
संपादक = vim
XDG_SESSION_ID = 106
उपयोगकर्ता = जड़
पीडब्ल्यूडी = / जड़
गृह = / जड़
SSH_CLIENT = 1.1.1.242 53960 22
SSH_TTY = / dev / सार्वजनिक टेलीफोन / 3
मेल = / var / मेल / जड़
अवधि = टर्म-256color
शेल = / bin / bash
SHLVL = 1
LOGNAME = जड़
DBUS_SESSION_BUS_ADDRESS = यूनिक्स: पथ = / रन / उपयोगकर्ता / 0 / बस
XDG_RUNTIME_DIR = / रन / उपयोगकर्ता / 0
पथ = / जड़ / बिन: / बिन: / sbin: / usr / bin: / 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))-

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

यह सही नहीं है क्योंकि वे अंतरिक्ष से अलग हैं एलएफ अलग नहीं हैं


-1

/ Proc / पीआईडी ​​/ पर्यावरण

इसके लिए, पहले हमें प्रक्रिया के PID की पहचान करने की आवश्यकता है। इसके लिए आप ps कमांड का उपयोग कर सकते हैं

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