2009-10-18 23 views
9

कैसे मैं लिनक्स पर एक प्रक्रिया के cmdline को विभाजित करने की कोशिश कर रहा हूं, लेकिन ऐसा लगता है कि मैं इसे '\ 0' वर्णों से अलग करने के लिए भरोसा नहीं कर सकता। क्या आप जानते हैं कि कभी-कभी '\ 0' वर्ण को विभाजक के रूप में क्यों उपयोग किया जाता है और कभी-कभी यह नियमित स्थान होता है?पार्स/proc/pid/cmdline

क्या आप निष्पादन योग्य नाम और इसके पथ को पुनर्प्राप्त करने के किसी अन्य तरीके से जानते हैं? मैं इस जानकारी को 'ps' के साथ प्राप्त करने का प्रयास कर रहा हूं लेकिन यह हमेशा पूर्ण कमांड लाइन देता है और निष्पादन योग्य नाम छोटा कर दिया जाता है।

धन्यवाद।

उत्तर

3

अंधेरे में एक शॉट, लेकिन क्या यह संभव है कि \0 शब्दों को अलग कर रहा है और रिक्त स्थान शब्द के भीतर शब्दों को अलग कर रहे हैं? उदाहरण के लिए,

myprog "foo bar" baz 

/proc/pid/cmdline के रूप में प्रकट हो सकता है ...

/usr/bin/myprog\0foo bar\0baz 

पूरा अनुमान यहाँ, मैं अपने लिनक्स बक्से में से एक पर कोई खाली स्थान को खोजने के लिए प्रतीत नहीं कर सकते हैं।

+1

हाय। जैसा कि आप उल्लेख करते हैं, रिक्त स्थान का उपयोग उसी शब्द में शब्दों को अलग करने के लिए किया जाता है, यह वही था जो मैं उम्मीद कर रहा था, लेकिन मेरे पास ऐसी मशीन तक पहुंच है जो रिक्त स्थान का उपयोग शर्तों को अलग करने के लिए भी कर रही है। यह एक उबंटू था, जो नहीं जानता कि कौन सी रिलीज है। – ryotakatsuki

10

/proc/PID/cmdline एनयूएल वर्णों से अलग है।

cat -v /proc/self/cmdline "a b" "c d e" 

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

रिक्त स्थान को समझने के लिए इस आदेश पर अमल तुम सच में रिक्त स्थान को देखते हैं जहां किसी भी वहाँ नहीं होना चाहिए, शायद अपने निष्पादन योग्य (जानबूझकर या अनजाने में) argv[] को लिखते हैं, या setproctitle() उपयोग कर रहा है ?

जब प्रक्रिया गिरी द्वारा शुरू किया गया है, cmdline NUL अलग की गई है, और kernel code simply copies स्मृति की सीमा जहां argv[] उत्पादन बफर में प्रक्रिया प्रारंभ होने के समय था जब आप /proc/PID/cmdline पढ़ें।

+0

जैसा कि मैंने उपरोक्त कहा था, जबकि मैं एक सहकर्मी को "समाधान" समझा रहा था, मुझे एहसास हुआ कि उसकी cmdlines व्यवहार नहीं कर रही थी जैसा कि मैं उम्मीद कर रहा था। हम दोनों उबंटू का उपयोग कर रहे हैं, इसलिए मुझे नहीं पता कि यह एक ऐसा व्यवहार है जिसे कॉन्फ़िगर किया जा सकता है या इस्तेमाल किए गए कर्नेल पर निर्भर करता है। – ryotakatsuki

+0

यह गलत है। कभी-कभी तर्कों को अलग करने की जगहें होती हैं - यानी यह सब argv [0] में है। मुझे यह पता है क्योंकि मैंने इसे देखा है। – camh

+0

प्रोग्राम द्वारा तर्क वेक्टर की उत्परिवर्तन यही कारण है कि मैंने आपके बयान पर विरोध किया। यदि आपने "हमेशा" नहीं कहा था और जोर दिया था, तो मैंने टिप्पणी नहीं की होगी। – camh

2

मेरे उत्तर here पर एक नज़र डालें। यह स्वयं को करने की कोशिश करते समय मुझे जो मिला वह शामिल करता है।

संपादित करें: this पर एक बैश स्क्रिप्ट के लिए डेबियन-उपयोगकर्ता पर धागा देखें जो आप चाहते हैं कि वह करने के लिए सर्वोत्तम प्रयास करें (उस धागे में स्क्रिप्ट के संस्करण 3 को देखें)।

+0

हाय। मैं पहले से ही अपने पथ से ट्रैक प्रक्रियाओं के समान कुछ कर रहा हूं, exe symlink पढ़ रहा हूं, लेकिन बड़ा मुद्दा cmd में निष्पादन योग्य नाम प्राप्त करना है। मेरा मतलब है, आमतौर पर, जब आप निष्पादन योग्य प्रक्रिया को संदर्भित करते हैं तो आप कहते हैं: "मैं emacs का पीआईडी ​​चाहता हूं" ताकि आप "emacs" ढूंढ सकें, न कि "/ usr/bin/emacs22-gtk" exe अंक के रूप में। जो मैंने ध्यान में नहीं लिया है वह रीडलिंक द्वारा रिपोर्ट की गई '(हटाई गई) स्ट्रिंग है। अगर मैं cmdline में जानकारी को सही ढंग से विभाजित कर सकता हूं तो मैं 'exe' द्वारा प्रदान की गई जानकारी के साथ अपनी जानकारी को मिश्रित कर सकता हूं। किसी भी मामले में, ऐसा लगता है कि कोई स्पष्ट तरीका नहीं है :)। धन्यवाद! – ryotakatsuki

+0

मैंने एक थ्रेड के लिए एक लिंक जोड़ा जहां मैंने एक स्क्रिप्ट पोस्ट की जिसमें मेरा कार्यान्वयन शामिल है। यह एक निष्पादन योग्य नाम को उस स्थान के साथ संभाल नहीं पाएगा, लेकिन वे दुर्लभ हैं (इतना दुर्लभ है कि मैंने कभी नहीं देखा है) – camh

+0

उआ ... महान काम, धन्यवाद! – ryotakatsuki

14

उपयोग strings

$ cat /proc/self/cmdline | strings -1 
cat 
/proc/self/cmdline 
6

उपयोग

cat /proc/2634/cmdline | tr "\0" " " 

आर्ग कारतूस से अलग कर दिया पाने के लिए, के रूप में आप इसे एक कमांड लाइन पर देखना होगा।

+0

"cat + tr" का उपयोग करने की कोई आवश्यकता नहीं है जब "tr" अकेले ऐसा कर सकता है, तो @ hek2mgl उत्तर देखें। –

4

/proc/PID/cmdline में कमांड लाइन तर्क शून्य बाइट्स से अलग होते हैं। आप नई लाइनों द्वारा उन्हें बदलने के लिए tr का उपयोग कर सकते हैं:

tr '\0' '\n' < /proc/"$PID"/cmdline