मैं एक डिवाइस ड्राइवर लिख रहा हूं जो रिंग बफर dmesg आउटपुट में त्रुटि संदेश प्रिंट करता है। dmesgजैसा कि यह बदलता है मैं आउटपुट देखना चाहता हूं ।
मैं यह कैसे कर सकता हूँ?
मैं एक डिवाइस ड्राइवर लिख रहा हूं जो रिंग बफर dmesg आउटपुट में त्रुटि संदेश प्रिंट करता है। dmesgजैसा कि यह बदलता है मैं आउटपुट देखना चाहता हूं ।
मैं यह कैसे कर सकता हूँ?
जवाबों:
अपेक्षाकृत हाल के dmesgसंस्करण एक अनुवर्ती विकल्प प्रदान करते हैं ( -w, --follow) जो अनुरूप काम करता है tail -f।
इस प्रकार, बस निम्नलिखित आदेश का उपयोग करें:
$ dmesg -wH
( -H, --humanउपयोगकर्ता के अनुकूल सुविधाओं जैसे रंग, सापेक्ष समय को सक्षम करता है)
वे विकल्प फेडोरा 19 में उदाहरण के लिए उपलब्ध हैं।
-Hबल्कि अन्यथा स्पॉट
-wयूटोपिक (14.10) से उबंटू के हर संस्करण में काम करना चाहिए। ( launchpad.net/ubuntu/+ource/util-linux/+publishinghistory का सुझाव है कि शुरुआती यूटोपिक पैकेज 2.20 के लिए थे, लेकिन इसे जारी किए जाने के समय तक 2.25 तक पहुंच गए।)
आप watchकमांड का उपयोग कर सकते हैं, जो इस तरह से चीजों के लिए अभिप्रेत है
watch -n 0.1 "dmesg | tail -n $((LINES-6))"
$((LINES-6))हिस्सा इसे अपने टर्मिनल में अच्छी तरह से फिट बनाना चाहिए।
watch। इस प्रकार यह वास्तव में चालान के बीच नहीं बदलेगा dmesg। एक को एक आवरण का उपयोग करने की आवश्यकता होगी जो टर्मिनल स्थिति को क्वेरी करेगा।
watch, इसलिए घड़ी वहां चर अभिव्यक्ति के साथ कमांड को निष्पादित करेगा, जिसे शेल द्वारा विस्तारित किया जाएगा। हर बार। कोशिश करो, यह काम करता है।
watchउपयोग करता है popen(), जिसका अर्थ है कि एक और शेल स्पॉन किया गया है और फिर पर्यावरण चर को इसके द्वारा आपूर्ति की जाती है (और इस प्रकार हर निष्पादित रन पर अपडेट किया जाता है)। अच्छा लगा।
आप वास्तव में dmesgसीधे आउटपुट को मॉनिटर नहीं कर सकते ।
हालाँकि, संभावना अधिक है कि आपका मॉड्यूल सीधे dmesg के रिंग-बफर में प्रिंट नहीं हो रहा है, लेकिन इसके बजाय कर्नेल लॉगिंग सुविधाओं का उपयोग करता है (जो तब प्रदर्शित होगा dmesg)। यदि आपकी syslogकुछ सेंस (जैसे डिफ़ॉल्ट) सेटिंग्स हैं, तो ये संदेश kern.logलॉगफ़ाइल में भी दिखाई देंगे ।
तो आप कुछ ऐसा कर सकते हैं:
tail -f /var/log/kern.log
/var/log/kern.logकाफी लिनक्स-विशिष्ट है। OpenBSD (और संभवतः अन्य) के लिए dmesg सामान / var / log / संदेशों में लॉग इन हो जाता है। दी, हालांकि कुछ अन्य सामान भी वहाँ जाता है।
tail -f /var/log/{messages,kernel,dmesg,syslog}सुपरसुअर के
आप dmesgकर्नेल के लॉग संदेश प्राप्त करने के लिए उपयोग करते हैं।
कर्नेल स्वयं एक रिंग बफर में लॉग इन करता है, अर्थात सिर्फ मेमोरी में। अब सब dmesgकरता है कि रिंग बफर की सामग्री का उत्पादन होता है। यदि आप ऐसा करते हैं तो dmesg -cबाद में रिंग बफर को भी हटा देगा।
इसलिए आप कुछ ऐसा कर सकते हैं जैसे while true; do dmesg -c; sleep 1; doneकाम न करने के बराबर dmesg|tail। लेकिन यह रिंग बफर को हटा देता है और इसलिए रूट पॉवर की जरूरत होती है।
दूसरा तरीका फ़ाइल है /proc/kmsgजो रिंग बफर पर एक दृश्य की अनुमति देता है। आप कर सकते थे tail -f /proc/kmsg, लेकिन यह केवल एक प्रक्रिया की अनुमति है, और यह आमतौर पर आपका लॉगिंग डेमॉन है। - यह काम है संदेशों को पढ़ना और वास्तविक फाइलों (आमतौर पर / var / log) में लिखना जहां उन्हें पढ़ा जा सकता है। इसे सभी संदेशों को एक ही फाइल या अलग-अलग हिस्सों में अलग-अलग फाइलों में आउटपुट करने के लिए कॉन्फ़िगर किया जा सकता है। (लेकिन कॉन्फ़िगरेशन आपके सिस्टम के लॉगिंग डेमॉन पर निर्भर करता है।)
इसलिए इस पर एक नज़र डालें /var/logकि क्या कोई फ़ाइल है जो आपकी आवश्यकताओं के अनुरूप है और अन्यथा आपके लॉगिंग डेमॉन को कॉन्फ़िगर करें।
यदि आप एक एम्बेडेड सिस्टम का उपयोग कर रहे हैं, तो OpenWRT जैसे सिस्टम पर कॉमनबॉक्स व्यस्त है, जिसमें बहुत सीमित कार्यक्षमता है और केवल 2-3 झंडे समर्थित हैं।
यदि आप घटनाओं पर लगातार बदलाव के रूप में स्क्रीन पर dmesg आउटपुट प्रिंट करने का एक त्वरित और गंदा तरीका चाहते हैं, तो एक साधारण बैश लूप ठीक काम करता है। यह आदर्श नहीं है, लेकिन जैसा कि मैंने उल्लेख किया है कि बिजीबॉक्स dmesg बहुत सारे कार्यों को याद कर रहा है। जब कमांड लाइन में प्रवेश किया जाता है, तो मुझे निम्न प्रभाव पड़ता है:
$ while true; do dmesg -c ; sleep 1 ; done
आप Ctrl-C नींद के साथ लूप को छोड़ सकते हैं 1 सीपीयू को अनावश्यक रूप से पीटना बंद करना है, और -c फ्लैग प्रत्येक कॉल पर बफर को साफ करता है ताकि आपको हर सेकंड बार-बार आउटपुट न दिखाई दे।
उपयोग करने वाले सिस्टम पर systemdभी:
# journalctl -kf
अलग-अलग टर्मिनलों से इन 2 आदेशों का उपयोग करें:
while true; do dmesg -c >> test.txt;sleep 1; donetail -f test.txtयह समान परिणाम प्राप्त करेगा।