2009-02-06 8 views
9

पर्ल में, मुझे अन्य प्रक्रियाओं के पर्यावरण को पढ़ने की जरूरत है।पर्ल और लिनक्स या सोलारिस पर्यावरण में अन्य प्रक्रियाओं के पर्यावरण चर पढ़ने के लिए कोई तरीका है?

  • स्क्रिप्ट रूट विशेषाधिकारों के साथ चल रहा है।
  • लिपि दोनों लिनक्स और सोलारिस में चल रहे होंगे।
  • मुझे ऐसा समाधान चाहिए जो कम से कम प्लेटफॉर्म अज्ञेयवादी है, कम से कम लिनक्स और सोलारिस के बीच। लिनक्स में,/env/< proc_id>/वातावरण की जांच करने से मुझे जवाब मिल सकता है।
  • मैं कांटा होने से बचना चाहता हूं। मेरे पास पहले से ही एक समाधान है "/ usr/ucb/ps -auxwwwe $ pid"

कोई विचार?

उत्तर

7

सोलार्स के लिए, आप procfs module from CPAN को आजमा सकते हैं। हालांकि इस मॉड्यूल अभी भी काफी युवा लगता है, इस उद्धरण लगता है उम्मीद:

ब्रायन फैरेल जो argv और प्रक्रियाओं वर्तमान में चल प्रक्रिया के अलावा अन्य के वातावरण की निरीक्षण संभालती है एक बहुत ही उपयोगी पैच भेजा है।

मुझे कल्पना है कि यह शायद प्रारंभिक वातावरण है (बस लिनक्स के तहत environ फ़ाइल की तरह), लेकिन ऐसा लगता है कि आप क्या चाहते हैं?

अन्यथा, हालांकि मुझे लगता है कि आप कहते हैं कि आप कांटा नहीं चाहते हैं, एक साधारण समाधान शायद सी के 20 लाइनों को क्रैक करने के लिए एक छोटा प्रोग्राम तैयार करेगा जो सोलारिस पर पर्यावरण को सटीक समकक्ष के रूप में थूकता है लिनक्स environ फ़ाइल। मेरे पास पहले से ही सी में कुछ समान है। यदि आप रुचि रखते हैं, तो मैं इसे पोस्ट कर सकता हूं।

संपादित करें (ओपनसोलालिस pargs.c पढ़ने के बाद): वातावरण में परिवर्तन होने पर सौर बफर को सौररी के तहत फिर से आवंटित किया जाता है, इसलिए psinfo सूचक अमान्य हो सकता है। बुलेट प्रूफ समाधान के लिए, आपको _environ का शिकार करना होगा। यह संभवतः आपको जितनी अधिक परेशानी होगी ... pargs -e <pid> यूसीबी ps(1) के लिए एक अच्छा विकल्प हो सकता है यदि आप कांटा मार्ग जाते हैं।

+1

स्पष्ट होने के लिए: परग्स -e जाने का तरीका है (इसे एक पर्ल सिस्टम कॉल के अंदर लपेटें) – PaulS

12

लिनक्स में यह /proc/<pid>/environ psuedofiles की तरह दिखता है जब प्रक्रिया बनाई गई थी तो वातावरण चर पारित होता है। यदि आपके पास पर्याप्त अनुमति है, तो आप उन्हें पढ़ सकते हैं।

वे लॉन्च के बाद प्रक्रिया पर्यावरण में परिवर्तनों को ट्रैक करने के लिए प्रकट नहीं होते हैं।

इससे पता चलता है कि आप जो भी मांग रहे हैं उसे पाने के लिए आपको प्रक्रिया मेमोरी डंप को निष्कासित करना होगा।

ट्रिकी।

+0

हे। ऐसा लगता है कि मैंने वास्तव में वह सवाल नहीं पढ़ा था। माफ़ कीजिये। – dmckee

+0

सोलार्स/प्रो फाइल सिस्टम (सोलारिस 10) में भी मूल वातावरण शामिल नहीं है। –

+0

@ जोनाथन,/proc/pid/psinfo फ़ाइल पर एक नज़र डालें, और से संरचना psinfo देखें। फील्ड pr_envp प्रारंभिक वातावरण है। –

5

पहली बात यह है कि मेरे दिमाग में आता है प्रश्न में प्रक्रिया को संलग्न करने के लिए GDB उपयोग कर रहा है, और फिर GDB पूछ आप के लिए वातावरण मिलता है। आप इसे जीडीबी खोल में "शो पर्यावरण" कमांड के साथ कर सकते हैं।

ऐसा लगता है कि एक पर्ल मॉड्यूल है जो आपके लिए यह कर सकता है, Devel::GDB। मेरे पास ने अभी तक यह कोशिश नहीं की है, लेकिन यह पर प्रोग्रामिंग का सरल मामला दिखता है, जो डेवेल :: जीडीबी ऑब्जेक्ट बनाता है, उस प्रक्रिया से कनेक्ट करें जिसे आप निरीक्षण करना चाहते हैं, "पर्यावरण दिखाएं" कमांड भेजें, और उसके बाद पार्स करें परिणाम है।

मुझे हालांकि कहना है ... जब समाधान यह जटिल है, तो आप शायद कुछ और गलत कर रहे हैं। यादृच्छिक प्रक्रिया के लिए आपको पर्यावरण की आवश्यकता क्यों है, वैसे भी?

+0

उद्धरण: आपको यादृच्छिक प्रक्रिया के लिए पर्यावरण की आवश्यकता क्यों है, वैसे भी? यह एक ऐसी स्क्रिप्ट का हिस्सा है जो सिस्टम पर चल रही प्रक्रियाओं पर जानकारी एकत्र करता है। बाद में विश्लेषण करने के लिए डेटा बचाया जाता है। –

+0

शो पर्यावरण जीडीबी के पर्यावरण को दिखाता है, न कि प्रक्रिया से जुड़ी प्रक्रिया। जीडीबी मैनुअल से: "जब यह शुरू होता है तो आपके प्रोग्राम को पर्यावरण चर वैरनाम का मान प्रिंट करें।" दूसरे शब्दों में, यदि आप प्रोग्राम लॉन्च करने की योजना बना रहे हैं तो पर्यावरण दिखाएं उपयोगी है, लेकिन यह आपके द्वारा संलग्न प्रोग्राम के माहौल के बारे में बताने के लिए उपयोगी नहीं है। अगर मैं गलत हूं तो मुझे सही करें, लेकिन मैनुअल के मेरे परीक्षण और पढ़ने से पता चलता है कि यह उत्तर पूरी तरह से गलत है। –

2

यदि पीएस ऐसा कर सकता है, जैसा कि आप कहते हैं, तो आपका उत्तर पीएस के स्रोत कोड में कहीं भी पाया जा सकता है। यह एक नई प्रक्रिया की शुरुआत से बच जाएगा।

8

जीएनयू 'बिनुटिल्स' पैकेज में एक सीएलआई उपयोगिता शामिल है जिसे strings कहा जाता है। अधिक जानकारी के लिए http://www.gnu.org/software/binutils/ देखें।

strings /proc/pid/environ - env जैसे पर्यावरण चर की एक अच्छी सूची प्रिंट करता है।

+1

मैं यहां भी एक गैर-पर्ल लिनक्स-विशिष्ट उत्तर की तलाश में आया था। '/ proc/$$/पर्यावरण '' KEY = value' स्ट्रिंग्स की एक नल-पृथक सूची है (मुझे' xxd/proc/$$/वातावरण 'पूछकर पता चला है लेकिन यह शायद कहीं कहीं दस्तावेज है)। आप इसे केवल मानक POSIX उपकरण के साथ कुछ और पठनीय में बदल सकते हैं। बस 'बिल्ली/proc/$$/पर्यावरण का उपयोग करें tr '\ 0' '\ n''। – alsuren

+0

@alsuren धन्यवाद। यह काम करता है। एक्सएक्सडी और आउटपुट को ठीक करने के लिए tr का उपयोग काफी उपयोगी है। –

0

लिनक्स पर /proc/[pid]/cwd सिम्लिंक को हल करने के लिए पर्याप्त हो सकता है, procfs(5) देखें।

संबंधित मुद्दे