परिवर्तन के रूप में मैं dmesg आउटपुट कैसे देख सकता हूं?


141

मैं एक डिवाइस ड्राइवर लिख रहा हूं जो रिंग बफर dmesg आउटपुट में त्रुटि संदेश प्रिंट करता है। dmesgजैसा कि यह बदलता है मैं आउटपुट देखना चाहता हूं ।

मैं यह कैसे कर सकता हूँ?


जवाबों:


178

अपेक्षाकृत हाल के dmesgसंस्करण एक अनुवर्ती विकल्प प्रदान करते हैं ( -w, --follow) जो अनुरूप काम करता है tail -f

इस प्रकार, बस निम्नलिखित आदेश का उपयोग करें:

$ dmesg -wH

( -H, --humanउपयोगकर्ता के अनुकूल सुविधाओं जैसे रंग, सापेक्ष समय को सक्षम करता है)

वे विकल्प फेडोरा 19 में उदाहरण के लिए उपलब्ध हैं।


2
अच्छा लगा! Gentoo नहीं, -Hबल्कि अन्यथा स्पॉट
unperson325680

उपयोगकर्ता अंतरिक्ष उपकरण को संस्करण 2.22+ होना चाहिए। उबंटू उपयोगकर्ताओं को 14.10 "यूटोपिक" संस्करण के लिए इंतजार करना होगा
डैनियल एल्डर

1
उबंटू ग्रॉक -w नहीं करता है - घड़ी (नीचे) का उपयोग करने की आवश्यकता है
ब्रेंट फॉस्ट

2
वाह एक sysadmin जवाब है कि का उपयोग करता है - cryptic एकल चरित्र झंडे के बजाय -descriptively नाम-झंडे। ब्रावो, एसआईआर। वाहवाही।
एलियूरोडकोड

1
-wयूटोपिक (14.10) से उबंटू के हर संस्करण में काम करना चाहिए। ( launchpad.net/ubuntu/+ource/util-linux/+publishinghistory का सुझाव है कि शुरुआती यूटोपिक पैकेज 2.20 के लिए थे, लेकिन इसे जारी किए जाने के समय तक 2.25 तक पहुंच गए।)
mwfearnley

54

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

watch -n 0.1 "dmesg | tail -n $((LINES-6))"

$((LINES-6))हिस्सा इसे अपने टर्मिनल में अच्छी तरह से फिट बनाना चाहिए।


2
यदि आप दोहरे उद्धरण चिह्नों के बजाय एकल उद्धरणों का उपयोग करते हैं (या डॉलर चिह्न से बच जाते हैं), तो आपको हर आह्वान के लिए $ LINES का एक नया मूल्य प्राप्त होगा, इसलिए यदि आप अपना टर्मिनल आकार बदलते हैं तो यह समायोजित हो जाएगा।
पी डैडी

एकल उद्धरण चर विस्तार को बाधित करेंगे। इसके अलावा, चर का केवल एक बार इस उदाहरण में विस्तार किया गया है - के आह्वान पर watch। इस प्रकार यह वास्तव में चालान के बीच नहीं बदलेगा dmesg। एक को एक आवरण का उपयोग करने की आवश्यकता होगी जो टर्मिनल स्थिति को क्वेरी करेगा।
पीटर

2
यह पूरी बात है। एकल उद्धरण चर विस्तार को प्रतिबंधित करते हैं जब शेल तर्कों को पास करता है watch, इसलिए घड़ी वहां चर अभिव्यक्ति के साथ कमांड को निष्पादित करेगा, जिसे शेल द्वारा विस्तारित किया जाएगा। हर बार। कोशिश करो, यह काम करता है।
पी डैडी

हम्म, आप सही हैं - मैं मान लेता हूं कि watchउपयोग करता है popen(), जिसका अर्थ है कि एक और शेल स्पॉन किया गया है और फिर पर्यावरण चर को इसके द्वारा आपूर्ति की जाती है (और इस प्रकार हर निष्पादित रन पर अपडेट किया जाता है)। अच्छा लगा।
पीटरफ

12

आप वास्तव में dmesgसीधे आउटपुट को मॉनिटर नहीं कर सकते ।

हालाँकि, संभावना अधिक है कि आपका मॉड्यूल सीधे dmesg के रिंग-बफर में प्रिंट नहीं हो रहा है, लेकिन इसके बजाय कर्नेल लॉगिंग सुविधाओं का उपयोग करता है (जो तब प्रदर्शित होगा dmesg)। यदि आपकी syslogकुछ सेंस (जैसे डिफ़ॉल्ट) सेटिंग्स हैं, तो ये संदेश kern.logलॉगफ़ाइल में भी दिखाई देंगे ।

तो आप कुछ ऐसा कर सकते हैं:

 tail -f /var/log/kern.log

/var/log/kern.logकाफी लिनक्स-विशिष्ट है। OpenBSD (और संभवतः अन्य) के लिए dmesg सामान / var / log / संदेशों में लॉग इन हो जाता है। दी, हालांकि कुछ अन्य सामान भी वहाँ जाता है।
कर्टम

2
tail -f /var/log/{messages,kernel,dmesg,syslog}सुपरसुअर के
यहां

9

आप dmesgकर्नेल के लॉग संदेश प्राप्त करने के लिए उपयोग करते हैं।

कर्नेल स्वयं एक रिंग बफर में लॉग इन करता है, अर्थात सिर्फ मेमोरी में। अब सब dmesgकरता है कि रिंग बफर की सामग्री का उत्पादन होता है। यदि आप ऐसा करते हैं तो dmesg -cबाद में रिंग बफर को भी हटा देगा।

इसलिए आप कुछ ऐसा कर सकते हैं जैसे while true; do dmesg -c; sleep 1; doneकाम न करने के बराबर dmesg|tail। लेकिन यह रिंग बफर को हटा देता है और इसलिए रूट पॉवर की जरूरत होती है।

दूसरा तरीका फ़ाइल है /proc/kmsgजो रिंग बफर पर एक दृश्य की अनुमति देता है। आप कर सकते थे tail -f /proc/kmsg, लेकिन यह केवल एक प्रक्रिया की अनुमति है, और यह आमतौर पर आपका लॉगिंग डेमॉन है। - यह काम है संदेशों को पढ़ना और वास्तविक फाइलों (आमतौर पर / var / log) में लिखना जहां उन्हें पढ़ा जा सकता है। इसे सभी संदेशों को एक ही फाइल या अलग-अलग हिस्सों में अलग-अलग फाइलों में आउटपुट करने के लिए कॉन्फ़िगर किया जा सकता है। (लेकिन कॉन्फ़िगरेशन आपके सिस्टम के लॉगिंग डेमॉन पर निर्भर करता है।)

इसलिए इस पर एक नज़र डालें /var/logकि क्या कोई फ़ाइल है जो आपकी आवश्यकताओं के अनुरूप है और अन्यथा आपके लॉगिंग डेमॉन को कॉन्फ़िगर करें।


//, CEntOS 6 सिस्टम पर मैं उपयोग कर रहा हूँ, सिलाई और देख / खरीद / kmsg कोई उत्पादन नहीं करता है। [~] $ Sudo पूंछ -f / proc / kmsg ♥% [~] $ sudo cat / proc / kmsg ♥% [~] $
नाथन Basanese

8

यदि आप एक एम्बेडेड सिस्टम का उपयोग कर रहे हैं, तो OpenWRT जैसे सिस्टम पर कॉमनबॉक्स व्यस्त है, जिसमें बहुत सीमित कार्यक्षमता है और केवल 2-3 झंडे समर्थित हैं।

यदि आप घटनाओं पर लगातार बदलाव के रूप में स्क्रीन पर dmesg आउटपुट प्रिंट करने का एक त्वरित और गंदा तरीका चाहते हैं, तो एक साधारण बैश लूप ठीक काम करता है। यह आदर्श नहीं है, लेकिन जैसा कि मैंने उल्लेख किया है कि बिजीबॉक्स dmesg बहुत सारे कार्यों को याद कर रहा है। जब कमांड लाइन में प्रवेश किया जाता है, तो मुझे निम्न प्रभाव पड़ता है:

$ while true; do dmesg -c ; sleep 1 ; done

आप Ctrl-C नींद के साथ लूप को छोड़ सकते हैं 1 सीपीयू को अनावश्यक रूप से पीटना बंद करना है, और -c फ्लैग प्रत्येक कॉल पर बफर को साफ करता है ताकि आपको हर सेकंड बार-बार आउटपुट न दिखाई दे।


1
Android डिबगिंग के लिए वास्तव में उपयोगी है।
वैल


0

अलग-अलग टर्मिनलों से इन 2 आदेशों का उपयोग करें:

  1. while true; do dmesg -c >> test.txt;sleep 1; done
  2. tail -f test.txt

यह समान परिणाम प्राप्त करेगा।


//, यह मूल रूप से damsg को test.txt, right के आउटपुट में जोड़ने का निर्देश देता है? और दूसरा कमांड सिर्फ उस test.txt फ़ाइल को देखता है?
नाथन बसानी

धन्यवाद .. हाँ .. दूसरा आदेश dmesg में परिवर्तन देखता है। cat / proc / kmsg समान आउटपुट प्राप्त कर सकता है, लेकिन यह लॉग को किसी फ़ाइल में नहीं बचाता है।
K_K
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.