क्या `dmesg` का उत्पादन` tail -f` करना संभव है?


137

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

dmesg | tail -f

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

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


यह मेरे Ubuntu 10.04LTS बॉक्स पर ठीक काम करता है। एक वर्कअराउंड जो भी लॉगफ़ाइल होगा उसे syslog में कर्नेल संदेश डाल रहा है।

4
मैक OSX पर, वह फ़ाइल /var/log/kernel.log है

1
@ अनाम 2: दुर्भाग्य से, kernel.logइसमें समान आउटपुट नहीं है dmesg। उदाहरण के लिए, एक क्षतिग्रस्त ड्राइव के लिए, फ़ाइल में त्रुटियों को dmesgठीक से निर्दिष्ट करें कि कौन सी फ़ाइल को पढ़ा नहीं जा सकता है, जबकि kernel.logदुर्भाग्य से केवल कम-से-उपयोगी सूचना प्रदान करता है:disk0s2: I/O error.
इवान वुज़िका

3
Linux 3.5 के बाद से, आप dmesg -w कर सकते हैं।
डग रिचर्डसन

जवाबों:


119

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

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

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

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

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

dmesg -w

4
सिर के लिए धन्यवाद फिर से multitail:। दिलचस्प लग रहा है। : ओएस एक्स के मामले में यह की तरह कुछ हो जाएगा tail -f /var/log/{system.log,kernel.log}
बोहज

2
system.logऔर ओएस एक्स पर kernel.logसटीक आउटपुट शामिल नहीं है। dmesgउदाहरण के लिए, एक क्षतिग्रस्त ड्राइव के लिए, फ़ाइल रीड एरर dmesgनिर्दिष्ट करें कि कौन सी फ़ाइल नहीं पढ़ी जा सकती है, जबकि kernel.logदुर्भाग्य से केवल कम से कम-उपयोगी सूचना प्रदान करता है:disk0s2: I/O error.
इवान वुज़िका

3
रिकॉर्ड के लिए, यह उत्तर OS X Mavericks (10.9) या आर्क लिनक्स पर काम नहीं करता है।
एले मुंडी

@ आर्क पर आप शायद एक syslog डेमॉन स्थापित या इसकी सेवा सक्षम नहीं है। मैंने देखा है कि बेस पैकेज का हिस्सा नहीं है, भले ही यह बहुत मौलिक हो। OSX BSD आधारित है और इसमें बहुत सारी चीजों के लिए अलग-अलग रास्ते हैं। आपको यह पता लगाना होगा कि आपका सिस्टम लॉगिंग और समायोजन को कैसे और कहाँ से हैंडल करता है। मेरा जवाब बहुत सामान्य है और syslog सक्षम के साथ सबसे अधिक FHS आधारित डिस्ट्रोस को कवर करता है, लेकिन बहुत सारे वैरिएंट कार्यान्वयन भी हैं।
कालेब

1
संपादित करें पर ++।
पस्टनटॉन

56

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

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

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

मैन पेज स्वीकृत: घड़ी + dmesg

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

watch 'dmesg | tail -50'

घड़ी + dmesg + डेमन + पूंछ -f

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

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

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


1
ओएस एक्स में नहीं है /proc, हालांकि आपका जवाब बाकी है। watchMacPorts से स्थापित किया जा सकता है: macports.org
इवान वुज़िका

@ इवान वुइका आह, जानकर अच्छा लगा। आश्चर्य है कि जहां OSX कर्नेल रिंग बफर का प्रतिनिधित्व करता है ..
djeikyb

2
ऐसा लगता है कि यह सीधे कर्नेल मेमोरी में है। Apple के dmesgकार्यान्वयन के लिए स्रोत कोड : filesource.apple.com/source/system_cmds/system_cmds-230.7// त्वरित Googling ने इसके बारे में कुछ भी उल्लेख नहीं किया है कि यह फाइलसिस्टम में दर्शाया जा रहा है: /
इवान वुइलिका

42

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

# dmesg -w

systemdआपके साथ सिस्टम पर भी :

# journalctl -kf

6
dmesg -wसबसे अच्छा समाधान है। दुर्भाग्य से, यहां तक ​​कि Ubuntu 14.04 भी इसके लिए तैयार नहीं लगता है क्योंकि उपयोगकर्ता अंतरिक्ष उपकरण अभी तक इसका समर्थन नहीं करता है।
डैनियल एल्डर

1
यह उत्तर निश्चित रूप से अब अधिक उत्थान के योग्य है।
m4tx

2
हाँ, यह एक अच्छा सा डला है। के साथ मानव पठनीय बनाया जा सकता है: dmesg -wH
faustus

21

यहाँ 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हमेशा के लिए (बेन हैरिस का जवाब देखें)। हालांकि, चूंकि यह वास्तव में कर्नेल संदेश बफर को साफ कर रहा है, क्योंकि यह चल रहा है, तो आप चीजों को एक लॉगफाइल में पाइप करना चाहते हैं यदि आप उन्हें बाद में चाहते हैं।


6

यह आपके काम आ सकता है

while true;do sudo dmesg -c;done

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


घड़ी वहां अच्छी हो सकती है, अगर आप हर समय स्क्रीन देख रहे हैं
सेठ रॉबर्टसन

2
: अपने स्रोतों का उल्लेख करने के लिए स्वतंत्र महसूस linuxforums.org/forum/applications/...

2
जल्दी और गन्दी। गंदा क्योंकि यह केवल तभी काम करता है जब आप ऐसा करने वाले केवल एक उपयोगकर्ता हों। अन्यथा प्रत्येक उपयोगकर्ता को संदेशों का केवल आधा हिस्सा मिलता है
डैनियल एल्डर

मेरे Android एडीबी समस्या हल करती है।
पीएनटूटाइन

5

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

#!/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;

3

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

tail -f /var/log/messages

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

7
मैं "सबसे" सिस्टम के बारे में नहीं जानता, लेकिन GNU लिनक्स सिस्टम में से कोई भी मैं उस तरह से व्यवहार नहीं करता। dmesgकर्नेल से नवीनतम संदेशों के वर्तमान सेट की रिपोर्ट करता है, जो आमतौर पर हार्डवेयर सबसिस्टम के लिए विशिष्ट होता है।
कालेब

3

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


कृपया आप बता सकते हैं कि यह एक समाधान क्यों है।
क्रिस

यह है कि कुछ वितरण पर्दे के पीछे क्या करते हैं। यह कर्नेल रिंगबफ़र को प्रदूषित करता है और इसे / tmp/dmesg.log में प्रत्येक 0.1 सेकंड एक पृष्ठभूमि नौकरी में लॉग करता है, जबकि यह उस आउटपुट को पूंछता है। इसके अलावा, यह एकमात्र तरीका है जो काम करेगा यदि आपके पास पृष्ठभूमि में कुछ विशेष नहीं चल रहा है - या यदि आपने सभी पृष्ठभूमि प्रक्रियाओं और सेवाओं को मार दिया है और आप आपातकालीन समस्या निवारण कर रहे हैं।
18

1
का उपयोग करने के लिए सरल लगता हैwatch
मंगनी

यदि आपके पास यह उपलब्ध है :-) कभी-कभी आप ऐसे वातावरण में होते हैं, जहां आपके पास पूंछ भी नहीं होती है ... तो आप cat /tmp/dmesg.log, या dd का भी उपयोग कर सकते हैं ... यदि आप नहीं लिख सकते हैं / tmp, और -t tmpfs को माउंट नहीं कर सकता - / tmp, या ramfs, या लिखकर / dev / shm / ... तब आप dmesg -c कर सकते हैं; नींद 0.1; do echo> / dev / null; किया, अगर आपको नींद नहीं आ रही है, तो बस dmesg -c; do echo> / dev / null; किया हुआ; कभी-कभी आपके पास ls भी नहीं होता है ... तो आप बस प्रतिध्वनि * :-D
Dagelf

2

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

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

जो dmesg को फॉलो करता है और इसमें जो भी टर्मिनल होता है उसके लिए लाइनों को एडजस्ट करता है।


0

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

tail -f /var/log/syslog

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


0

मैंने एक विशेष कर्नेल ईवेंट देखने के लिए इस कोड का उपयोग किया और इसे "कॉलबैक" प्रक्रिया से जोड़ा:

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

-2

एक पुराने सवाल का जवाब, लेकिन किसी को यह उपयोगी मिल सकता है :)

dmesg | पूंछ -f -

स्टंपआउट के शॉर्टकट के रूप में - ऑपरेटर के उपयोग से पूंछ के माध्यम से dmesg के आउटपुट को पाइप करता है


2
यह सवाल से कोड है जो काम नहीं करता है।
पाबौक

2
यह काम नहीं करता क्योंकि dmesgएक बार बंद करने के बाद आउटपुट बंद हो जाता है। tail -fअब इसे बदल नहीं सकते।
डैनियल एल्डर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.