विंडो मैनेजर से शुरू किए गए एप्लिकेशन से आउटपुट कहां जाता है?


10

यदि आप एक टर्मिनल से एक आवेदन शुरू करते हैं तो आप आउटपुट को स्टडआउट और स्टडर के लिए देख सकते हैं, लेकिन अगर विंडो मैनेजर से कोई एप्लिकेशन शुरू किया जाता है, तो इन फ़ाइलों का आउटपुट आम तौर पर कहां जाता है? करने के लिए / देव / अशक्त?


1
सुझाव: ps fauxयह जांचने के लिए उपयोग करें कि प्रक्रिया किस tty / pts से जुड़ी है। अगर कोई नहीं या "?" यह शायद शून्य में खो जाता है। (यह सिर्फ एक विचार है, मैं गलत हो सकता
हूं

@Kwaio: मान एक प्रश्न चिह्न (?) है, जैसा कि आप कहते हैं, यह संभवतः शून्य में खो जाता है।
अगस्त कार्लस्ट्रॉम

2
यदि आपने अपना ग्राफिकल शेल gdm या kdm से शुरू किया है तो आउटपुट पाया जा सकता है~/.xsession-errors
Shadur

जवाबों:


8

विंडो मैनेजर से शुरू किए गए एप्लिकेशन का आउटपुट उसी जगह पर जाता है, जहां विंडो मैनेजर से आउटपुट होता है। (जब तक कि एप्लिकेशन इसे पुनर्निर्देशित नहीं करता, लेकिन विशिष्ट GUI अनुप्रयोग नहीं करते।)

आप यह पता कर सकते हैं कि फ़ाइल डिस्क्रिप्टर 1 (स्टैंडर्ड आउटपुट) और फ़ाइल डिस्क्रिप्टर 2 (स्टैंडर्ड एरर) पर क्या खुला है, यह देखकर डब्ल्यूएम का आउटपुट कहाँ जाता है। आम तौर पर दोनों एक ही फाइल पर जाएंगे। अपने विंडो प्रबंधक की प्रक्रिया आईडी जानकारी प्राप्त करें (कोशिश जैसे pgrep metacityया pidof metacityअगर मेटासिटी अपने विंडो प्रबंधक है - अगर आप अपने विंडो प्रबंधक के लिए प्रक्रिया नाम पता नहीं है, इस प्रक्रिया के पेड़ में से एक की जड़ में देखो द्वारा रिपोर्ट ps fया pstree)। मान लें कि आपके विंडो मैनेजर की प्रक्रिया आईडी 1234 है, चलाएं

lsof -p1234

और विवरण 1 और 2 फाइल करने के लिए संगत लाइनों के लिए देखो, या

या

ls -l /proc/1234/fd

आप प्रासंगिक फ़ाइल विवरणकों के फ़िल्टरिंग को स्वचालित कर सकते हैं:

lsof -p1234 | awk '$4 ~ /^[12][^0-9]/'
ls -l /proc/1234/fd/[12]

(नोट: ऊपर दी गई सभी कमांड लिनक्स के लिए हैं। pgrepअन्य यूनियनों के बीच आम है, और lsofइसे कहीं भी बहुत अधिक स्थापित किया जा सकता है; psविकल्प और /procसामग्री अलग-अलग यूनियनों में भिन्न हैं।)

सामान्य स्थिति में जहां आप एक टर्मिनल एमुलेटर (xterm, konsole, gnome-terminal, आदि) में चल रहे शेल से कमांड चला रहे हैं, लेकिन जब स्क्रीन या tmux में उपयोग नहीं किया जाता है), तो आप आसानी से देख सकते हैं कि टर्मिनल एमुलेटर का आउटपुट कहां है टर्मिनल एमुलेटर आपके शेल की मूल प्रक्रिया है। टर्मिनल एमुलेटर अतिरिक्त विशेषाधिकारों के साथ चल रहा है, तो यह काम नहीं करता है, जो टर्मिनल एमुलेटर को लॉग-इन उपयोगकर्ता सूची (utmp) में लिखने की अनुमति देने के लिए कुछ प्रणालियों पर होता है।

lsof -p$PPID
ls -l /proc/$PPID/fd

कई वितरण एक्स सत्र के आउटपुट को निर्देशित करते हैं ~/.xsession-errors


मेरे मामले में WM से शुरू होने वाले बाल-अभिभावक पदानुक्रम ब्लैकबॉक्स <- lightdm <- lightdm <- init और सभी टिट्स का मान है? ""। मुझे लगता है कि तब आउटपुट कहीं नहीं जाता है।
अगस्त कार्लस्ट्रोम

@AugustKarlstrom तब pidof blackboxया pgrep blackboxविंडो प्रबंधक की पीआईडी ​​पाने के लिए, या सीधे lsof -p$(pidof blackbox)। टिट्स का इससे कोई लेना-देना नहीं है।
गिल्स एसओ- बुराई को रोकें

1
आह, बिल्कुल। कमान ls -l /proc/<blackbox-id>/fdमुझे बताती है कि stdout में जाता है /dev/nullऔर stderr को जाता है ~/.xsession-errors
अगस्त कार्लस्ट्रॉम

1

विंडो मैनेजर X सर्वर का बच्चा है, इसलिए यह और इसके बच्चों का आउटपुट X सर्वर के समान ही होता है।

यदि आप केवल उपयोगकर्ता हैं और आप ग्राफिक रूप से लॉगिन करते हैं, तो कुछ सिस्टम आउटपुट कंसोल से एक्स सर्वर उदाहरण को विस्थापित करते हैं, जिसका अर्थ है कि आप उस वीटी पर स्विच कर सकते हैं और इसे देख सकते हैं। वास्तविक रूप से, व्यवस्था आमतौर पर alt-ctrl-f1एक्स उदाहरण के लिए आउटपुट कंसोल alt-ctrl-f7है और एक्स डिस्प्ले है, लेकिन आप जितने चाहें मिल सकते हैं। पहले 6 आमतौर पर लॉगइन को फैलाते हैं, लेकिन संभावित रूप से अधिक होते हैं जो खाली नहीं होते हैं और खाली आउटपुट के साथ दिखाई देते हैं। Init से उनमें से कुछ पर आउटपुट हो सकता है, एक्स से आउटपुट के साथ भ्रमित न करें। मेरे अनुभव में एक्स और बच्चे हमेशा चेतावनी और संदेशों की एक महत्वपूर्ण राशि (लापता फोंट, मूल्यह्रास कॉल आदि) के बारे में भौंकते हैं।

यदि आप GUI के माध्यम से लॉग इन नहीं करते हैं, तो यह वही होगा जो आपने वीटी एक्स से शुरू किया था, जो एक समस्या है क्योंकि आप इसे तब तक नहीं देखेंगे जब तक आप छोड़ नहीं देते। मेरा मानना ​​है कि GUI लॉगिन, XDM (ग्राफ़िकल लॉगिन) एक विशेषाधिकार प्राप्त प्रक्रिया के रूप में चलता है, जिसका अर्थ है कि यह आउटपुट को पाइप कर सकता है /dev/tty7startx 1>&2> /dev/tty7यदि आपके पास सही सुपरसुसर विशेषाधिकार हैं तो आप भी ( ) कर सकते हैं ।


1
startxया xinitसीधे के मामले में एक हमेशा वांछित खिड़की प्रबंधक पर ~/.xinitrcकरने से पहले पुनर्निर्देशन करने के लिए tweak कर सकते हैं exec। ख़ुद मैंने कभी इस तरह के आउटपुट को मिस नहीं किया। अगर मुझे लगता है कि GUI एप्लिकेशन क्या बना रहा है तो मैं इसे टर्मिनल से चलाता हूं। लेकिन वास्तव में यह मददगार हो सकता है इसलिए मैंने stdout और stderr को रीडायरेक्ट किया ~/.xinitrcहै ~/.xinitrc.out
Miroslav Koškár

0

यदि आप यह लेते हैं कि आम तौर पर एक प्रोग्राम एक man 2 forkऔर श्रृंखला शुरू करता है और man 2 execveफिर उस प्रक्रिया में डिफॉल्ट फाइल डिस्क्रिप्टर खुले रहते हैं।

तो इसका उत्तर यह है कि आम तौर पर आउटपुट / एरर उस जगह जाता है जहां पैरेंट का प्रोसेस आउटपुट / एरर कांटे के समय पर इंगित होता था (जब तक कि पैरेंट प्रोग्राम कुछ रीडायरेक्ट नहीं करता)। मुझे लगता है कि जब तक हम मूल कार्यक्रम का नाम नहीं जानते, तब तक आप कुछ अधिक विशिष्ट दावा नहीं कर सकते। विंडो प्रबंधक प्रक्रिया अन्य कार्यक्रमों को सीधे लॉन्च करने में शायद ही कभी शामिल होती है।

मेरे मामले में उदाहरण के लिए

  • Ctrl + P ( xmonadविंडो मैनेजर द्वारा संभाला ) दबाना शुरू हो जाएगाdmenu_run
  • dmenu_runमेरे इनपुट को हैंडल करेगा और कुछ एप्लिकेशन शुरू करेगा (जैसे। xkill)

आउटपुट में जाना होगा /dev/tty1क्योंकि

  • xkill द्वारा शुरू किया गया था dmenu_run
  • dmenu_run द्वारा शुरू किया गया था xmonad
  • xmonad द्वारा शुरू किया गया था X
  • X द्वारा शुरू किया गया था startx
  • startx पहले वर्चुअल कंसोल से मैन्युअल रूप से मेरे द्वारा शुरू किया गया था /dev/tty1

केवल एक संदर्भ के लिए, यदि आप यह जानना चाहते हैं कि आउटपुट / त्रुटि कहां जाती है, या बेहतर तरीके से कहते हैं कि किसी विशेष प्रक्रिया के लिए खोले गए फ़ाइल विवरणकर्ता क्या हैं (ज्ञात पीआईडी ​​के साथ),

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