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


Vous voulez faire quelque chose comme

dmesg | tail -f

mais ça ne marche pas: J'utilise Mac OSX 10.6.7, en faisant en sorte que la queue quitte, au lieu de surveiller la sortie.

Je me demande s'il existe un moyen de le faire, ou une commande équivalente. P.S., je ne pense pas while la boucle sera une bonne idée.


121
2018-05-26 21:55


origine


Cela fonctionne bien sur ma boîte Ubuntu 10.04LTS. Une solution de contournement consisterait à suivre le fichier journal dans lequel syslog envoie les messages du noyau.
Sur Mac OSX, ce fichier est /var/log/kernel.log
@Marc Désolé, j'ai ajouté ma spécification de machine maintenant. @bobDevil C'est cool, mais il semble que la sortie soit différente de dmesg. Cependant celui-ci est plus joli - Ivan Z. G. Xiao
Depuis Linux 3.5, vous pouvez faire dmesg -w. - Doug Richardson
unix.stackexchange.com/questions/95842/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


Réponses:


Vous recherchez probablement une combinaison de messages provenant de différents fichiers journaux. Essayer:

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

... pour avoir une bonne vue d'ensemble du système. Si vous voulez plus ou moins que cela, recherchez quel fichier journal les messages que vous voulez voir sont placés dans.

Regardez également en utilisant multitail pour classer et colorer le code et filtrer plusieurs fichiers journaux à la fois.

Modifier: Ce n'était pas très pertinent lorsque j'ai répondu à cette question, mais comme cette page a beaucoup de résultats, je pense qu'il est utile de mentionner que les nouveaux systèmes exécutant systemd ont ceci.

dmesg -w

104
2018-05-26 22:04



Merci pour le heads-up re: multitail. Semble intéressant. Dans le cas d'OS X, il s'agira de quelque chose comme: tail -f /var/log/{system.log,kernel.log}. - boehj
system.log et kernel.log ne contiennent pas la sortie exacte de dmesg sur OS X. Par exemple, pour un lecteur endommagé, les erreurs de lecture de fichier dans dmesg spécifier exactement quel fichier n'a pas pu être lu, kernel.log ne fournit malheureusement que l'avis peu utile: disk0s2: I/O error. - Ivan Vučica
Pour mémoire, cette réponse ne fonctionne pas sur OS X Mavericks (10.9) ou Arch Linux. - Elle Mundy
@Dan On Arch n'a probablement pas de démon syslog installé ou son service activé. J'ai remarqué que cela ne fait pas partie du paquetage de base même si c'est assez fondamental. OSX est basé sur BSD et a des chemins différents pour beaucoup de choses. Vous devez déterminer comment et où votre système gère la journalisation et le réglage. Ma réponse est assez générique et couvre la plupart des distributions basées sur FHS avec syslog activé, mais il existe également de nombreuses variantes d'implémentation. - Caleb
++ sur l'édition. - pstanton


Il suffit de le faire @ # $% ing work

  1. Vous voulez imprimer la sortie de dmesg, constamment, immédiatement
  2. Dmesg imprime le tampon en anneau du noyau (voir man dmesg)
  3. Le tampon en anneau du noyau est un fichier proc spécial, /proc/kmsg (voir man proc)
  4. Lis /proc/kmsg directement, c.-à-d. cat /proc/kmsg.

Maintenant, si vous lisez le manuel convivial, il vous avertira sévèrement de ne laisser qu'un seul utilisateur (qui doit être privilégié) lire /proc/kmsg à la fois. Quelle que soit l'implémentation de Syslog que vous avez, vous devriez le faire, et cela fonctionne probablement avec dmesg. Je ne sais pas, je suis hors de ma ligue ici, en paraphrasant le manuel. Donc, bien que ce soit la méthode "faites-le simplement @ # $% ing", considérez d'abord les deux méthodes suivantes.

Page de manuel approuvée: montre + dmesg

Sur Arch gnu / linux avec systemd init *, dmesg.log n'est pas écrit très souvent, peut-être pas du tout? La meilleure façon de lire le tampon de journal du noyau est d'utiliser watch. Quelque chose comme ça devrait vous permettre de commencer (ajustez le nombre de lignes qui correspondent à votre terminal):

watch 'dmesg | tail -50'

montre + dmesg + démon + queue -f

Une solution plus compliquée peut utiliser watch pour écrire la sortie dmesg dans un fichier, que vous pouvez ensuite tail -f. Vous voudrez probablement que cela fonctionne comme un démon. Un démon approprié serait également gzip et faire pivoter les journaux. Le code bash suivant n'est pas testé, ne fonctionne pas et vise uniquement à transmettre une idée. La réponse de @Brooks Moses a un version de travail.

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

* tangente, car ceci est une question de type osx, mais quand systemd est là, ne vous embêtez pas avec dmesg, utilisation journalctl -xf (peut-être w / -n 100 pour afficher également les 100 lignes précédentes)


50
2018-06-11 22:42



OS X n'a ​​pas /proc, cependant le reste de votre réponse est applicable. watch peut être installé à partir de MacPorts: macports.org - Ivan Vučica
@Ivan Vučica Ah, bon à savoir. Je me demande où OSX représente le tampon en anneau du noyau. - djeikyb
On dirait que c'est directement dans la mémoire du noyau. Code source pour Apple dmesg la mise en oeuvre: opensource.apple.com/source/system_cmds/system_cmds-230.7/Quick Googling ne mentionne rien à propos de sa représentation dans le système de fichiers: / - Ivan Vučica


Pour ceux qui s'intéressent à Linux, depuis le noyau 3.5.0:

# dmesg -w

Aussi sur les systèmes avec systemd vous pouvez:

# journalctl -kf

32
2018-03-28 14:27



dmesg -w est la solution la plus belle. Malheureusement, même Ubuntu 14.04 ne semble pas être prêt car l'outil d'espace utilisateur ne le prend pas encore en charge. - Daniel Alder
Cette réponse mérite définitivement plus de commentaires maintenant. - m4tx
oui, c'est une belle petite pépite. peut être rendu lisible par l'homme avec: dmesg -wH - faustus


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

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

Le truc important est que nous faisons dmesg -c, qui efface la mémoire tampon après son impression - ainsi, à chaque fois, nous imprimons uniquement ce qui est nouveau depuis la dernière fois. Vous devrez être root pour le faire, donc le sudo. Il y a aussi un correctif; au lieu d'essayer à la fois de transférer la sortie dans un fichier et de la diriger vers la fin (ce qui ne fonctionne pas), nous lisons simplement le fichier nouvellement écrit.

On pourrait faire juste dmesg > /tmp/dmesg.log et écraser le fichier entier à chaque itération, mais cela implique beaucoup d'E / S et risque également de perdre le fichier si l'ordinateur se bloque au milieu d'un écrasement.

Vous pourriez aussi faire quelque chose de similaire, plus proche de tail -f avec une boucle while qui s'exécute dmesg -c et sleep 1 pour toujours (voir la réponse de Ben Harris). Cependant, comme cela efface en fait le tampon de messages du noyau pendant son exécution, vous pouvez également souhaiter transférer des éléments dans un fichier journal au cas où vous le souhaiteriez plus tard.


21
2017-07-20 21:45





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 CPU, essayez d’ajouter un «sleep 1» avant que la boucle ne soit terminée.


6
2018-05-26 22:05



regarder peut être bien là, si vous regardez l’écran tout le temps - Seth Robertson
N'hésitez pas à citer vos sources: linuxforums.org/forum/applications/
Rapide et sale. Sale car cela ne fonctionne que si vous êtes le seul utilisateur à le faire. Sinon, chaque utilisateur ne reçoit que la moitié des messages - Daniel Alder
résout mon problème adb Android. - PAntoine


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;

5
2017-11-05 13:45





vous pourriez être capable de faire:

tail -f /var/log/messages

3
2018-05-26 22:01



Sur la plupart des systèmes, le fichier journal dmesg n'est qu'un fichier statique du tampon dmesg une fois le démarrage du système terminé. Après cela, tous les nouveaux messages du noyau vont généralement dans un autre fichier journal et le fichier dmesg reste inchangé jusqu'au redémarrage.
Je ne connais pas la plupart des systèmes, mais aucun des systèmes Linux GNU que je administre ne se comporte de cette façon. dmesg rapporte un ensemble actuel des derniers messages du noyau, généralement spécifiques aux sous-systèmes matériels. - Caleb


tandis que dmesg -c >> /tmp/dmesg.log; faire dormir 0.1; done & tail -f /tmp/dmesg.log


3
2018-03-05 08:26



Pouvez-vous expliquer pourquoi il s’agit d’une solution? - ChrisF
C'est ce que font certaines distributions dans les coulisses. Il interroge le ringbuffer du noyau et le connecte à /tmp/dmesg.log toutes les 0,1 secondes dans un job d'arrière-plan pendant qu'il termine cette sortie. En outre, c'est la seule méthode qui fonctionnera si vous n'avez pas quelque chose de spécial exécuté en arrière-plan - ou si vous avez tué tous les processus et services d'arrière-plan et que vous effectuez un dépannage d'urgence. - Dagelf
Semble plus simple à utiliser watch - poolie
Si vous l'avez disponible :-) parfois vous êtes dans un environnement où vous n'avez même pas de queue ... alors vous pouvez utiliser cat /tmp/dmesg.log, ou dd même ... Si vous ne pouvez pas écrire to / tmp, et ne peut pas monter -t tmpfs - / tmp, ou ramfs, ou écrire dans / dev / shm / ... alors vous pouvez juste dmesg -c; dormir 0,1; do echo> / dev / null; fait, si vous ne dormez pas, juste pendant que dmesg -c; do echo> / dev / null; terminé; Parfois, vous n'avez même pas ls ... alors vous faites juste écho * :-D - Dagelf


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 n'importe quel terminal auquel il est appelé.


2
2018-02-04 09:16





Sous Ubuntu actuel (j'utilise Ubuntu 12.04),

tail -f /var/log/syslog

peut répondre à l'exigence.


0
2017-12-17 04:37





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

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

0
2018-01-22 22:49