सवाल क्या `dmesg` के आउटपुट को 'tail -f` करना संभव है?


कुछ ऐसा करना चाहते हैं

dmesg | tail -f

लेकिन यह काम नहीं करता है: मैं मैक ओएसएक्स 10.6.7 का उपयोग करके, आउटपुट की निगरानी के बजाय पूंछ बाहर निकलता हूं।

मुझे आश्चर्य है कि ऐसा करने का कोई तरीका है, या कोई समकक्ष कमांड है। पीएस, मुझे नहीं लगता while लूप एक अच्छा पर्याप्त विचार होगा।


123
2018-05-26 21:55


मूल


यह मेरे उबंटू 10.04 एलटीएस बॉक्स पर ठीक काम करता है। Syslog कर्नेल संदेशों को डाल रहा है जो भी logfile पूंछ करने के लिए एक कामकाज होगा।
मैक ओएसएक्स पर, वह फ़ाइल /var/log/kernel.log है
@Marc क्षमा करें मैंने अब अपनी मशीन स्पेक जोड़ा है। @bobDevil यह अच्छा है, लेकिन लगता है कि आउटपुट dmesg से अलग है। हालांकि यह एक अच्छा दिखता है - Ivan Z. G. Xiao
लिनक्स 3.5 के बाद से, आप dmesg -w कर सकते हैं। - Doug Richardson
unix.stackexchange.com/questions/95842/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


जवाब:


आप शायद विभिन्न लॉग फ़ाइलों से संदेशों के कुछ संयोजन की तलाश कर रहे हैं। प्रयत्न:

tail -f /var/log/{messages,kernel,dmesg,syslog}

... प्रणाली का एक अच्छा अच्छा अवलोकन पाने के लिए। यदि आप इससे अधिक या उससे कम चाहते हैं, तो शोध करें कि आप जिस संदेश को देखना चाहते हैं उसे लॉग फ़ाइल में रखा जा रहा है।

उपयोग करने में भी देखो multitail फ़ाइल और रंग कोड और एक साथ कई लॉग फ़ाइलों को फ़िल्टर करने के लिए।

संपादित करें: जब मैंने इसका उत्तर दिया तो यह बहुत प्रासंगिक नहीं था, लेकिन चूंकि इस पृष्ठ को बहुत सारी हिट मिलती हैं, मुझे लगता है कि सिस्टम सिस्टम चलाने वाले नए सिस्टमों का यह उल्लेख करने लायक है।

dmesg -w

106
2018-05-26 22:04



हेड-अप के लिए धन्यवाद: multitail। दिलचस्प लग रहा है। ओएस एक्स के मामले में यह कुछ ऐसा होगा: tail -f /var/log/{system.log,kernel.log}। - boehj
system.log तथा kernel.log का सटीक आउटपुट नहीं है dmesg ओएस एक्स पर। उदाहरण के लिए, क्षतिग्रस्त ड्राइव के लिए, फ़ाइल त्रुटियों को पढ़ती है dmesg निर्दिष्ट करें कि वास्तव में कौन सी फाइल को पढ़ा नहीं जा सका, जबकि kernel.log दुर्भाग्य से केवल कम से कम उपयोगी सूचना प्रदान करता है: disk0s2: I/O error. - Ivan Vučica
रिकॉर्ड के लिए, यह उत्तर ओएस एक्स मैवरिक्स (10.9) या आर्क लिनक्स पर काम नहीं करता है। - Elle Mundy
@ डैन ऑन आर्क में आपके पास शायद एक syslog डिमन स्थापित नहीं है या इसकी सेवा सक्षम है। मैंने देखा है कि बेस पैकेज सेट का हिस्सा नहीं है, भले ही यह बहुत मौलिक है। ओएसएक्स बीएसडी आधारित है और कई चीजों के लिए अलग-अलग पथ हैं। आपको यह पता लगाना होगा कि आपका सिस्टम लॉगिंग और समायोजन कैसे करता है। मेरा जवाब बहुत सामान्य है और syslog सक्षम के साथ अधिकांश एफएचएस आधारित distros को कवर करता है, लेकिन कई प्रकार के संस्करण कार्यान्वयन भी हैं। - Caleb
संपादन पर ++। - pstanton


बस इसे # # $% आईएनजी काम करें

  1. आप तुरंत, लगातार, dmesg के आउटपुट मुद्रित करना चाहते हैं
  2. डीएमएसजी कर्नेल रिंग बफर प्रिंट कर रहा है (देखें man dmesg)
  3. कर्नेल रिंग बफर एक विशेष प्रो फाइल है, /proc/kmsg (देख man proc)
  4. पढ़ना /proc/kmsg सीधे, यानी cat /proc/kmsg

अब, यदि आप दोस्ताना प्रो मैनुअल पढ़ते हैं, तो यह आपको केवल एक उपयोगकर्ता को अनुमति देने के लिए चेतावनी देगा (जिसे विशेषाधिकार प्राप्त किया जाना चाहिए) /proc/kmsg समय पर। आपके पास जो भी syslog कार्यान्वयन है, वह करना चाहिए, और संभवतः यह काम करता है dmesg। मुझे पता नहीं, मैं यहां अपने लीग से बाहर हूं, बस मैनुअल को छेड़छाड़ कर रहा हूं। तो यह "बस इसे # # $% काम करने के तरीके" बनाते हैं, पहले अगले कुछ तरीकों पर विचार करें।

मैन पेज अनुमोदित: घड़ी + dmesg

Systemd init * के साथ आर्क gnu / linux पर, dmesg.log को अक्सर लिखा नहीं जाता है, शायद बिलकुल नहीं? कर्नेल लॉग बफर को लगातार पढ़ने के लिए मैंने पाया सबसे अच्छा तरीका है watch। ऐसा कुछ आपको शुरू करना चाहिए (आपके टर्मिनल में कितनी लाइनें फिट हैं इसके लिए समायोजित करें):

watch 'dmesg | tail -50'

घड़ी + dmesg + daemon + tail -f

एक अधिक घुलनशील समाधान फ़ाइल में dmesg आउटपुट लिखने के लिए घड़ी का उपयोग कर सकता है, जिसे आप तब कर सकते थे tail -f। आप शायद यह एक डेमॉन के रूप में चलना चाहते हैं। एक उचित डेमॉन भी लॉग को घुमाएगा और घुमाएगा। निम्नलिखित बैश कोड अवांछित, असंगत है, और केवल एक विचार व्यक्त करने का इरादा है। @ ब्रुक्स मूसा के जवाब में एक है कामकाजी संस्करण

watch 'dmesg >> /var/log/dmesg.log | tail -1'

* टेंगेंट, क्योंकि यह एक ओएसएक्स सवाल है, लेकिन जब systemd आसपास है, तो परेशान मत करो dmesg, उपयोग journalctl -xf (शायद डब्ल्यू / -n 100 पिछले 100 लाइनों को भी दिखाने के लिए)


52
2018-06-11 22:42



ओएस एक्स नहीं है /procहालांकि, आपका शेष उत्तर लागू है। watch मैकपॉर्ट्स से स्थापित किया जा सकता है: macports.org - Ivan Vučica
@Ivan Vučica आह, जानना अच्छा है। आश्चर्य है जहां ओएसएक्स कर्नेल रिंग बफर का प्रतिनिधित्व करता है .. - djeikyb
ऐसा लगता है कि यह सीधे कर्नेल मेमोरी में है। ऐप्पल के लिए स्रोत कोड dmesg कार्यान्वयन: opensource.apple.com/source/system_cmds/system_cmds-230.7/...क्विक गूगलिंग फाइल सिस्टम में इसका प्रतिनिधित्व करने के बारे में कुछ भी नहीं बताती है: / - Ivan Vučica


लिनक्स में रुचि रखने वालों के लिए, कर्नेल कर्नेल 3.5.0 के बाद से:

# dmesg -w

इसके साथ सिस्टम पर भी systemd आप ऐसा कर सकते हैं:

# journalctl -kf

36
2018-03-28 14:27



dmesg -w बिल्कुल सबसे अच्छा समाधान है। दुर्भाग्य से, उबंटू 14.04 भी इसके लिए तैयार नहीं प्रतीत होता है क्योंकि उपयोगकर्ता स्पेस टूल अभी तक इसका समर्थन नहीं करता है। - Daniel Alder
यह उत्तर निश्चित रूप से अब अधिक अपवर्तनीय हकदार है। - m4tx
हाँ, यह एक अच्छा छोटा गूंज है। मानव के साथ पठनीय बनाया जा सकता है: dmesg -wH - faustus


यहां djeikyb के उत्तर पर एक संस्करण है जिसका वास्तव में परीक्षण किया गया है, और कुछ कीड़े को हल करता है।

watch 'sudo dmesg -c >> /tmp/dmesg.log; tail -n 40 /tmp/dmesg.log'

महत्वपूर्ण चाल यह है कि हम कर रहे हैं dmesg -c, जो प्रिंट के बाद रिंग बफर को साफ़ करता है - इस प्रकार, हर बार हम केवल प्रिंटिंग कर रहे हैं जो आखिरी बार से नया है। ऐसा करने के लिए आपको रूट होने की आवश्यकता होगी, इस प्रकार sudo। एक बगफिक्स भी है; आउटपुट को फ़ाइल में डंप करने और इसे पूंछ (जो काम नहीं करता) को पाइप करने की कोशिश करने के बजाय, हम केवल नई लिखित फ़ाइल से पढ़ रहे हैं।

हम बस कर सकते थे dmesg > /tmp/dmesg.log और प्रत्येक पुनरावृत्ति की पूरी फ़ाइल को ओवरराइट करें, लेकिन यह बहुत सारे I / O है और अगर फ़ाइल ओवरराइट के बीच में दुर्घटनाग्रस्त हो जाती है तो फ़ाइल को खोने का जोखिम भी होता है।

आप ऐसा कुछ भी कर सकते हैं जो अधिक बारीकी से है tail -f थोड़ी देर के साथ निष्पादित करता है dmesg -c तथा sleep 1 हमेशा के लिए (बेन हैरिस का जवाब देखें)। हालांकि, चूंकि यह वास्तव में कर्नेल संदेश बफर को चल रहा है, क्योंकि आप इसे बाद में चाहते हैं तो आप लॉगफाइल में चीजों को पाइप करना चाहेंगे।


21
2017-07-20 21:45





यह आपके लिए काम कर सकता है

while true;do sudo dmesg -c;done

ध्यान रखें कि '-सी' ध्वज संदेश बफर को stdout में साफ़ करता है। यदि आप जड़ हैं तो 'सूडो' अनावश्यक है। अगर आपको लगता है कि यह आपके सीपीयू संसाधन का अधिकतर खा रहा है, तो लूप होने से पहले 'नींद 1' जोड़ने का प्रयास करें।


6
2018-05-26 22:05



यदि आप स्क्रीन को हर समय देख रहे हैं तो देखो वहां अच्छा हो सकता है - Seth Robertson
अपने स्रोतों को उद्धृत करने के लिए स्वतंत्र महसूस करें: linuxforums.org/forum/applications/...
जल्दी और गन्दी। गंदा क्योंकि यह केवल तभी काम करता है यदि आप ऐसा करने वाले एकमात्र उपयोगकर्ता हैं। अन्यथा प्रत्येक उपयोगकर्ता को केवल आधा संदेश मिलते हैं - Daniel Alder
मेरी एंड्रॉइड एडीबी समस्या हल करता है। - PAntoine


इस पोस्ट को देखने से पहले यह किया था:

#!/usr/bin/env perl

use strict;
use warnings;

# "tail -f" for dmesg
# Keeps last printed line. Anything sorting "gt" will be newer

$|=1;

my $y = '';

while(1) {
    for my $k (`dmesg`) {
        if ($k gt $y) {
            print $k;
            $y = $k;
        }
    }        
    sleep 1;
}
exit;

5
2017-11-05 13:45





आप ऐसा करने में सक्षम हो सकते हैं:

tail -f /var/log/messages

3
2018-05-26 22:01



अधिकांश सिस्टम पर, सिस्टम बूट पूर्ण होने के बाद dmesg लॉग फ़ाइल dmesg बफर का केवल एक स्थिर डंप है। उसके बाद, कोई भी नया कर्नेल संदेश आमतौर पर किसी अन्य लॉग फ़ाइल में जाता है और डीएमएसजी फ़ाइल रीबूट होने तक अपरिवर्तित रहेगी।
मुझे "सबसे अधिक" सिस्टम के बारे में पता नहीं है, लेकिन जीएनयू लिनक्स सिस्टम में से कोई भी व्यवस्थापक इस तरह से व्यवहार नहीं करता है। dmesg कर्नेल से नवीनतम संदेशों के वर्तमान सेट की रिपोर्ट करता है, आमतौर पर हार्डवेयर उपप्रणाली के लिए विशिष्ट। - Caleb


जबकि dmesg -c >> /tmp/dmesg.log; नींद 0.1; किया और tail -f /tmp/dmesg.log


3
2018-03-05 08:26



कृपया आप बता सकते हैं कि यह एक समाधान क्यों है। - ChrisF
दृश्यों के पीछे कुछ वितरण क्या करते हैं। यह कर्नेल रिंगबफर को चुनाव करता है और पृष्ठभूमि आउटपुट में प्रत्येक 0.1 सेकंड में /tmp/dmesg.log पर लॉग करता है, जबकि यह आउटपुट को पूंछ करता है। साथ ही, यह एकमात्र तरीका है जो काम करेगा यदि आपके पास पृष्ठभूमि में कुछ खास चल रहा नहीं है - या यदि आपने सभी पृष्ठभूमि प्रक्रियाओं और सेवाओं को मार दिया है और आप आपातकालीन समस्या निवारण कर रहे हैं। - Dagelf
उपयोग करने के लिए सरल लगता है watch - poolie
यदि आपके पास यह उपलब्ध है :-) कभी-कभी आप ऐसे माहौल में होते हैं जहां आपके पास पूंछ भी नहीं है ... तो आप cat /tmp/dmesg.log, या dd का उपयोग भी कर सकते हैं ... यदि आप लिख नहीं सकते करने के लिए / tmp, और tmpfs - / tmp, या ramfs को माउंट नहीं कर सकते हैं, या / dev / shm / ... पर लिख सकते हैं, तो आप dmesg -c के दौरान बस कर सकते हैं; नींद 0.1; गूंज करें> / dev / null; किया, अगर आप सो नहीं है, बस dmesg -c के दौरान; गूंज करें> / dev / null; किया हुआ; कभी-कभी आपके पास भी ls नहीं है ... तो आप सिर्फ गूंज * :- डी करते हैं - Dagelf


मैं इस उपनाम का उपयोग /root/.bashrc में करता हूं;

alias dwatch='watch -n 0.1 "dmesg | tail -n $((LINES-6))"'

जो dmesg का पालन करता है और जो भी टर्मिनल में कॉल किया जाता है, उसके लिए रेखाओं को समायोजित करता है।


2
2018-02-04 09:16





वर्तमान उबंटू के तहत (मैं उबंटू 12.04 का उपयोग कर रहा हूं)

tail -f /var/log/syslog

आवश्यकता को पूरा कर सकते हैं।


0
2017-12-17 04:37





मैंने इस कोड का इस्तेमाल एक विशेष कर्नेल इवेंट की तलाश में किया और इसे "कॉलबैक" प्रक्रिया को पाइप किया:

while true ; do dmesg -c ; sleep .1 ; done \
| grep --line-buffered  -o $pattern \
| ... 

0
2018-01-22 22:49