Est-il possible de `tail -f` la sortie de` dmesg`?

137

Veux faire quelque chose comme

dmesg | tail -f

mais cela ne fonctionne pas: j'utilise Mac OSX 10.6.7, ce qui fait que la queue se fermera au lieu de surveiller la sortie.

Je me demande s'il existe un moyen de le faire, ou une commande équivalente. PS, je ne pense pas qu'une whileboucle sera une idée assez bonne.

Ivan ZG Xiao
la source
cela fonctionne bien sur ma boîte Ubuntu 10.04LTS. Une solution de contournement consisterait à définir le fichier journal dans lequel syslog insère les messages du noyau.
4
Sur Mac OSX, ce fichier est /var/log/kernel.log
1
@Anonymous 2: Malheureusement, kernel.logne contient pas la même sortie que dmesg. Par exemple, pour un lecteur endommagé, les erreurs de lecture de fichier dmesgspécifient avec précision quel fichier n'a pas pu être lu, alors que, kernel.logmalheureusement, ne fournit que la remarque peu utile:disk0s2: I/O error.
Ivan Vučica
3
Depuis Linux 3.5, vous pouvez faire dmesg -w.
Doug Richardson
2
unix.stackexchange.com/questions/95842/…
Ciro Santilli a commencé à jouer

Réponses:

120

Vous recherchez probablement une combinaison de messages provenant de divers fichiers journaux. Essayer:

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

… Pour avoir un bon aperçu du système. Si vous voulez plus ou moins que cela, recherchez dans quel fichier de journal les messages que vous voulez voir sont placés.

Recherchez également dans les multitailfichiers et les codes de couleurs et filtrez plusieurs fichiers journaux à la fois.

Edit: Cela n’était pas très pertinent lorsque j’ai répondu à cette question, mais comme cette page reçoit de nombreux hits, je pense qu’il vaut la peine de mentionner que les systèmes plus récents exécutant systemd ont cela.

dmesg -w
Caleb
la source
5
Merci pour la heads-up re: multitail. Semble intéressant. Dans le cas d'OS X , ce sera quelque chose comme: tail -f /var/log/{system.log,kernel.log}.
boehj
2
system.loget kernel.logne contiennent pas la sortie exacte de dmesgOS X. Par exemple, pour un lecteur endommagé, les erreurs de lecture de fichier dmesgspécifient exactement quel fichier ne peut pas être lu, alors que, kernel.logmalheureusement, ne fournit que la remarque peu utile:disk0s2: I/O error.
Ivan Vučica
3
Pour mémoire, cette réponse ne fonctionne pas sous OS X Mavericks (10.9) ou Arch Linux.
Elle Mundy
@Dan On Arch ne contient probablement pas de démon syslog ni de service activé. J'ai remarqué que cela ne fait pas partie du paquetage de base même s'il est assez fondamental. OSX est basé sur BSD et a des chemins différents pour beaucoup de choses. Vous devrez déterminer comment et où votre système gère la journalisation et les réglages. Ma réponse est assez générique et couvre la plupart des distributions basées sur FHS avec syslog, mais il existe également de nombreuses variantes de mise en œuvre.
Caleb
1
++ sur l'édition.
pstanton
56

Il suffit de faire @ # $% ing travail

  1. Vous voulez imprimer la sortie de dmesg, constamment, immédiatement
  2. Dmesg est en train d’imprimer le tampon circulaire du noyau (voir man dmesg)
  3. Le tampon circulaire du noyau est un fichier proc spécial, /proc/kmsg(voir man proc)
  4. Lire /proc/kmsgdirectement, c'est à dire cat /proc/kmsg.

Maintenant, si vous lisez le manuel convivial de proc, il vous avertira de ne laisser qu'un seul utilisateur (qui doit être privilégié) à la lecture /proc/kmsg. Quelle que soit l'implémentation de syslog que vous avez devrait faire cela, et cela fonctionne vraisemblablement avec dmesg. Je ne sais pas, je suis hors de mon championnat ici, juste pour paraphraser le manuel. Ainsi, bien que ce soit la méthode "il suffit de le faire @ # $% ing", considérons d’abord les méthodes suivantes.

Page de manuel approuvée: watch + dmesg

Sur Arch gnu / linux avec systemd init *, dmesg.log n’est pas écrit très souvent, peut-être même pas du tout? La meilleure façon de lire le tampon de journalisation du noyau que j'ai trouvé est d'utiliser watch. Quelque chose comme ceci devrait vous aider à démarrer (ajustez le nombre de lignes contenues dans votre terminal):

watch 'dmesg | tail -50'

regarder + dmesg + daemon + tail -f

Une solution plus compliquée pourrait utiliser watch pour écrire la sortie de dmesg dans un fichier, que vous pourriez ensuite tail -f. Vous voudrez probablement que cela fonctionne en tant que démon. Un démon approprié serait également gzip et faire pivoter les journaux. Le code bash suivant est non testé, non fonctionnel et uniquement destiné à véhiculer une idée. La réponse de @Brooks Moses a une version de travail .

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

* tangente, car c’est une question osx, mais lorsque systemd est présent, ne vous embêtez pas avec dmesg, utilisez journalctl -xf(peut-être -n 100aussi pour afficher les 100 lignes précédentes)

djeikyb
la source
1
OS X n'a ​​pas /proc, cependant le reste de votre réponse est applicable. watchpeut être installé depuis MacPorts: macports.org
Ivan Vučica
@ Ivan Vučica Ah, bon à savoir.
Je me
2
On dirait que c'est directement dans la mémoire du noyau. Le code source d'Apple dmesgmise en œuvre: opensource.apple.com/source/system_cmds/system_cmds-230.7/... rapide recherche sur Google ne mentionne rien à ce sujet étant représenté dans le système de fichiers: /
Ivan Vucica
42

Pour ceux intéressés par Linux, depuis le noyau noyau 3.5.0:

# dmesg -w

Aussi sur les systèmes avec systemdvous pouvez:

# journalctl -kf
Maxime
la source
6
dmesg -west la solution absolument la plus gentille. Malheureusement, même Ubuntu 14.04 ne semble pas être prêt pour cela car l'outil d'espace utilisateur ne le supporte pas encore.
Daniel Alder
1
Cette réponse mérite certainement plus de votes positifs maintenant.
m4tx
2
oui, c'est une belle petite pépite. peut être rendu lisible avec: dmesg -wH
faustus
21

Voici une variante de la réponse de djeikyb qui a été testée et qui corrige quelques bugs.

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

Le truc important est que nous faisons ce dmesg -cqui efface le tampon de sonnerie après l’impression - ainsi, à chaque fois, nous n’imprimons que les nouveautés depuis la dernière fois. Vous devez être root pour le faire, donc le sudo. Il y a aussi un bugfix; au lieu d'essayer à la fois de vider la sortie dans un fichier et de la canaliser (ce qui ne fonctionne pas), nous lisons simplement à partir du fichier nouvellement écrit.

Nous pourrions faire juste dmesg > /tmp/dmesg.loget écraser le fichier entier à chaque itération, mais cela fait beaucoup d'E / S et risque également de perdre le fichier si l'ordinateur tombe en panne au milieu d'un écrasement.

Vous pouvez également faire quelque chose de similaire qui ressemble plus étroitement tail -fà une boucle while qui s'exécute dmesg -cet sleep 1pour toujours (voir la réponse de Ben Harris). Cependant, étant donné que cela efface réellement la mémoire tampon de messages du noyau pendant son exécution, vous pouvez également diriger des éléments dans un fichier journal au cas où vous les voudriez plus tard.

Brooks Moses
la source
6

Cela peut fonctionner pour vous

while true;do sudo dmesg -c;done

N'oubliez pas que l'indicateur '-c' efface le tampon de messages dans stdout. Le 'sudo' est inutile si vous êtes root. Si vous pensez que cela consomme trop de ressources de votre processeur, essayez d’ajouter un «sommeil 1» avant la fin de la boucle.


la source
La montre sera peut-être bonne si vous regardez l'écran tout le temps
Seth Robertson
2
N'hésitez pas à citer vos sources: linuxforums.org/forum/applications/…
2
Rapide et sale. Sale parce que cela ne fonctionne que si vous êtes le seul utilisateur à le faire. Sinon, chaque utilisateur reçoit seulement la moitié des messages
Daniel Alder
résout mon problème android adb.
PAntoine
5

A fait cela avant de voir ce post:

#!/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;
Mécanicien Quantique
la source
3

vous pourriez être capable de faire:

tail -f /var/log/messages
Ed L
la source
2
Sur la plupart des systèmes, le fichier journal dmesg est simplement un vidage statique du tampon dmesg une fois le démarrage du système terminé. Après cela, tous les nouveaux messages du noyau sont généralement insérés dans un autre fichier journal et le fichier dmesg reste inchangé jusqu'au redémarrage.
7
Je ne connais pas la plupart des systèmes, mais aucun des systèmes GNU Linux que je gère ne se comporte de cette façon. dmesgrapporte un ensemble actuel des derniers messages du noyau, généralement spécifiques aux sous-systèmes matériels.
Caleb
3

tandis que dmesg -c >> /tmp/dmesg.log; dormez 0,1; done & tail -f /tmp/dmesg.log

Dagelf
la source
Pouvez-vous expliquer pourquoi c'est une solution?
ChrisF
C'est ce que certaines distributions font en coulisses. Il interroge le ringbuffer du noyau et le consigne dans /tmp/dmesg.log toutes les 0,1 seconde dans un travail en arrière-plan pendant la fin de la sortie. En outre, c'est la seule méthode qui fonctionnera si quelque chose de particulier ne fonctionne pas en arrière-plan - ou si vous avez tué tous les processus et services en arrière-plan et si vous effectuez un dépannage d'urgence.
Dagelf
1
Semble plus simple à utiliserwatch
poolie
Si vous l'avez disponible :-) Parfois, vous êtes dans un environnement où vous n'avez même pas de queue ... vous pouvez alors utiliser cat /tmp/dmesg.log, ou même jj ... Si vous ne pouvez pas écrire sur / tmp, et ne peut pas monter -t tmpfs - / tmp, ou ramfs, ou écrire sur / dev / shm / ... alors vous pouvez simplement dmesg -c; dormir 0,1; echo> / dev / null; C'est fait, si vous ne dormez pas, alors que dmesg -c; echo> / dev / null; terminé; Parfois, vous n'avez même pas de ls ... alors vous venez de faire écho * :-D
Dagelf
2

J'utilise cet alias dans /root/.bashrc;

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

qui suit dmesg et ajuste les lignes pour le terminal appelé.

drgibbon
la source
0

Sous l’actuel Ubuntu (j’utilise Ubuntu 12.04),

tail -f /var/log/syslog

peut répondre à l'exigence.

Bill Zhao
la source
0

J'ai utilisé ce code pour rechercher un événement spécial du noyau et lui ai transmis un processus de "rappel":

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

réponse à une vieille question, mais quelqu'un pourrait trouver cela utile :)

dmesg | queue -f -

achemine la sortie de dmesg par tail en utilisant l'opérateur - comme raccourci vers stdout

Random Linux Dood
la source
2
C'est le code de la question qui ne fonctionne pas.
Pabouk
2
Cela ne fonctionne pas car dmesgferme la sortie après la fermeture une fois. tail -fne peut plus changer cela.
Daniel Alder