“Dmesg” in çıktısını “kuyruk” etmek mümkün müdür?


137

Gibi bir şey yapmak istiyorum

dmesg | tail -f

ama işe yaramadı: Mac OSX 10.6.7 kullanıyorum, çıktıyı izlemek yerine kuyruğun çıkmasını sağlayarak.

Bunu yapmanın herhangi bir yolu veya eşdeğeri bir komut olup olmadığını merak ediyorum. PS, bir whiledöngünün yeterince iyi bir fikir olacağını sanmıyorum.


benim Ubuntu 10.04LTS kutumda iyi çalışıyor. Bir geçici çözüm, syslog'un çekirdek mesajlarını içine koyduğu günlük dosyasını koymaktır.

4
Mac OSX'te, bu dosya /var/log/kernel.log

1
@Anonymous 2: Maalesef, kernel.logaynı çıktıyı içermiyor dmesg. Örneğin, hasarlı bir sürücü için, dosya okuma hataları dmesgtam olarak hangi dosyanın okunamayacağını belirtirken, kernel.logne yazık ki yalnızca yararlı olmayan bildirimlerden oluşur:disk0s2: I/O error.
Ivan Vučica

3
Linux 3.5'ten beri, dmesg -w komutunu kullanabilirsiniz.
Doug Richardson

Yanıtlar:


119

Muhtemelen çeşitli günlük dosyalarından gelen bazı mesaj kombinasyonlarını arıyorsunuzdur. Deneyin:

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

… Sisteme güzel bir genel bakış için. Bundan daha fazla veya daha az istiyorsanız, görmek istediğiniz iletilerin hangi günlük dosyasına yerleştirildiğini araştırın.

Ayrıca multitaildosya ve renk kodu kullanmaya bakın ve aynı anda birden fazla günlük dosyasını filtreleyin.

Düzenleme: Buna cevap verdiğimde bu çok alakalı değildi, ancak bu sayfa çok fazla isabet çektiği için sistemi çalıştıran yeni sistemlerin buna sahip olduğunu söylemeye değeceğini düşünüyorum.

dmesg -w

4
Röportajlar için teşekkürler multitail. İlgi çekici görünüyor. : OS X durumda böyle bir şey olacak tail -f /var/log/{system.log,kernel.log}.
boehj,

2
system.logve OS X'in kernel.logtam çıktısını içermez dmesg. Örneğin, hasarlı bir sürücü için, dosya okuma hataları dmesgtam olarak hangi dosyanın okunamadığını belirtirken, kernel.logne yazık ki yalnızca yararlı olmayan uyarıları sağlar:disk0s2: I/O error.
Ivan Vučica

3
Kayıt için bu cevap OS X Mavericks (10.9) veya Arch Linux üzerinde çalışmıyor.
Elle Mundy

@Dan Arch'da muhtemelen bir syslog arka plan programı yüklü değil veya servisi etkin değil. Oldukça temel olmasına rağmen temel paketin bir parçası olmadığını farkettim. OSX BSD tabanlıdır ve pek çok şey için farklı yollara sahiptir. Sisteminizin günlüğe kaydetme ve ayarlama işlemlerini nasıl ve nerede gerçekleştirdiğini öğrenmeniz gerekir. Cevabım oldukça genel ve syslog etkin FHS tabanlı dağıtımların çoğunu kapsıyor, ancak aynı zamanda birçok farklı uygulama var.
Caleb

1
++ düzenleme üzerinde.
pstanton

56

Sadece @ # $ ing çalışmasını sağlayın

  1. Dmesg'in çıktısını hemen yazdırmak istiyorsunuz.
  2. Dmesg, çekirdek halkası tamponunu yazdırıyor (bkz. man dmesg)
  3. Çekirdek halkası tamponu özel bir proc dosyasıdır /proc/kmsg(bkz. man proc)
  4. /proc/kmsgDoğrudan oku , yani cat /proc/kmsg.

Şimdi, dost canlısı kullanım kılavuzunu okursanız /proc/kmsg, bir seferde yalnızca bir kullanıcının (ayrıcalıklı olması gereken) okumasına izin vermesi sizi sert bir şekilde uyaracaktır . Yaptığınız her syslog uygulaması bunu yapmalı ve muhtemelen birlikte çalışıyor olmalıdır dmesg. Bilmiyorum, burada ligden çıktım, sadece el kitabını değiştirerek. Yani bu "sadece% # ing iş yap" yolu olsa da, bir sonraki çift yöntemlerini düşünün.

Man sayfası onaylandı: watch + dmesg

Systemd init * 'e sahip Arch gnu / linux'da dmesg.log çok sık yazılmıyor, belki de hiç yazılmıyor mu? Çekirdek günlük arabelleğini okuduğum en iyi yol sürekli watch. Bunun gibi bir şey sizi başlatmalı (terminalinize kaç adet hat sığacak şekilde ayarlayın):

watch 'dmesg | tail -50'

izle + dmesg + daemon + kuyruk-f

Daha karmaşık bir çözüm, daha sonra yapabileceğiniz dosyaya dmesg çıktısı yazmak için watch'i kullanabilir tail -f. Muhtemelen bunun bir daemon olarak çalışmasını isterdin. Uygun bir arka plan programı ayrıca günlükleri döndürür ve döndürür. Aşağıdaki bash kodu denenmemiş, işe yaramaz ve sadece bir fikir iletmek için tasarlanmıştır. @ Brooks Moses'in cevabı çalışan bir versiyona sahip .

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

* teğet, çünkü bu bir osx sorusudur, ancak sistemdeyken, uğraşmayın dmesg, kullanın journalctl -xf(belki -n 100de önceki 100 satırı göstermek için)


1
OS X'te bulunmamakla /procbirlikte, cevabınızın geri kalan kısmı geçerlidir. watchMacPorts'tan kurulabilir: macports.org
Ivan Vučica

@Ivan Vučica Ah, bilmek güzel.
OSX'in

2
Doğrudan çekirdek belleğine benziyor. Apple'ın dmesguygulaması için kaynak kodu : opensource.apple.com/source/system_cmds/system_cmds-230.7/… Quick Googling, dosya sisteminde temsil edildiğinden bahsetmiyor: /
Ivan Vučica

42

Linux ile ilgilenenler için, çekirdek 3.5.0'dan beri:

# dmesg -w

Ayrıca systemdyanınızda bulunan sistemlerde :

# journalctl -kf

6
dmesg -wkesinlikle en güzel çözüm. Ne yazık ki, kullanıcı alanı aracı henüz desteklemediğinden Ubuntu 14.04 bile buna hazır görünmüyor.
Daniel Alder

1
Bu cevap kesinlikle şimdi daha fazla oy hakkı hak ediyor.
m4tx

2
evet, bu hoş küçük bir külçe. insan ile okunabilir hale getirilebilir: dmesg -wH
faustus 26:15

21

İşte djeikyb'in gerçekte test edilen cevabı üzerine bir değişken var ve birkaç hata düzeltildi.

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

Önemli dmesg -colan, baskı yaptıktan sonra halka tamponunu temizleyen yapıyoruz - bu nedenle, her seferinde sadece en son olandan beri yeni olanı basıyoruz. Bunu yapabilmek için root olmanız gerekir sudo. Ayrıca bir hata düzeltildi; çıktıyı bir dosyaya dökmek ve kuyruğa yönlendirmek (işe yaramaz) yerine, sadece yeni yazılmış dosyayı okuyoruz.

Biz sadece yapabileceği dmesg > /tmp/dmesg.logve bütün dosyayı her yineleme üzerine, ama bu I / O bir sürü ve ayrıca bir üzerine yazma ortasında bilgisayar çökerse dosyayı kaybetme riskine.

Ayrıca tail -f, bir süre döngü yürüten dmesg -cve sleep 1sonsuza kadar benzer bir şey yapabilir (Ben Harris'in cevabına bakınız). Ancak, bu aslında çekirdek ileti arabelleğini çalıştığı gibi temizlediği için, daha sonra istemeniz durumunda bir şeyi bir günlük dosyasına yönlendirmek isteyebilirsiniz.


6

Bu sizin için işe yarayabilir

while true;do sudo dmesg -c;done

'-C' bayrağının mesaj arabelleğini stdout içine temizlediğini unutmayın. Kök iseniz 'sudo' gerekli değildir. Bunun CPU kaynağınızdan çok fazla yediğini düşünüyorsanız, döngü bitmeden önce '1 uyku' eklemeyi deneyin.


Her zaman ekranı izliyorsanız saatiniz iyi olabilir
Seth Robertson

2
Kaynaklarınızı belirtmekten çekinmeyin: linuxforums.org/forum/applications/…

2
Hızlı ve kirli. Kirli çünkü sadece bunu yapan bir kullanıcıysanız çalışır. Aksi halde her kullanıcı mesajların yalnızca yarısını alır
Daniel Alder

android adb problemimi çözdü.
PAntoine

5

Bunu bu yazıyı görmeden önce yaptım:

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

yapabilirsin:

tail -f /var/log/messages

2
Çoğu sistemde, dmesg günlük dosyası, sistem önyüklemesi tamamlandıktan sonra dmesg arabelleğinin statik bir dökümüdür. Bundan sonra, herhangi bir yeni çekirdek mesajı genellikle başka bir günlük dosyasına gider ve dmesg dosyası yeniden başlatılıncaya kadar değişmeden kalır.

7
"Çoğu" sistemden haberim yok ama yönettiğim GNU Linux sistemlerin hiçbiri bu şekilde davranmıyor. dmesggenellikle donanım alt sistemlerine özgü olan, çekirdekten gelen en son iletilerin güncel bir kümesini bildirir.
Caleb

3

dmesg -c >> /tmp/dmesg.log; 0.1 uyku yapın; bitti ve kuyruğu -f /tmp/dmesg.log


Lütfen bunun neden bir çözüm olduğunu açıklayabilir misiniz?
Chris

Bazı dağıtımların perde arkasında yaptığı şey bu. Çekirdek ringbuffer'ı çağırır ve arka planda çalışan her 0.1 saniyede bir /tmp/dmesg.log dosyasına kaydeder. Ayrıca, arka planda çalışan özel bir şeyiniz yoksa veya tüm arka plan işlemlerini ve hizmetlerini öldürdüyseniz ve acil durum sorun gidermesi yapıyorsanız işe yarayacak tek yöntem budur.
Dagelf,

1
Kullanımı daha basit görünüyorwatch
poolie

Elinizde varsa :-) bazen kuyruğunuzun bile olmadığı bir ortamdasınız ... o zaman cat /tmp/dmesg.log veya dd bile kullanabilirsiniz ... Yazamıyorsanız to / tmp, ve -t tmpfs - / tmp veya ramfs'i bağlayamaz veya / dev / shm / ... 'a yazamazsınız, o zaman dmesg -c; uyku 0.1; echo> / dev / null; eğer uyuyamıyorsanız, dmesg -c; echo> / dev / null; yapılan; Bazen sende ls bile yoktur ... o zaman yankı yaparsın * :-D
Dagelf

2

Bu takma adı /root/.bashrc;

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

bu dmesg'i izler ve hangi terminalde olursa olsun hatlarını ayarlar.


0

Geçerli Ubuntu altında (Ubuntu 12.04 kullanıyorum),

tail -f /var/log/syslog

gereksinimi karşılayabilir.


0

Bu kodu özel bir çekirdek olayı aramak için kullandım ve bir "geri çağırma" işlemi gerçekleştirdim:

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

-2

eski bir soruya verilen yanıt, ancak birileri onu faydalı bulabilir :)

dmesg | kuyruk-f -

- operatörünü stdout'a kısayol olarak kullanarak dmesg çıkışını kuyruktan geçirir


2
Bu işe yaramayan soru kodudur.
pabouk

2
dmesgÇalışmıyor çünkü bir kez kapattıktan sonra çıkışı kapatıyor. tail -fBunu artık değiştiremiyorum.
Daniel Alder
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.