183 votes

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

Je veux faire quelque chose comme

dmesg | tail -f

mais ça ne marche pas :

J'utilise Mac OS X v10.6.7 (Snow Leopard). En faisant cela, tail quittera, 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 qu'un while boucle sera une assez bonne idée.

177voto

Tom Gewecke Points 1034

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

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

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

Cherchez également à utiliser multitail pour classer, coder par couleur et filtrer plusieurs fichiers journaux à la fois.

Editar: Ce n'était pas très pertinent lorsque j'ai répondu à cette question, mais comme cette page reçoit beaucoup de visites, j'ai pensé qu'il valait la peine de mentionner que les systèmes plus récents utilisant systemd ont ceci.

dmesg -w

78voto

Maxim Points 2203

Sous Linux, depuis le noyau 3.5.0, vous pouvez utiliser :

dmesg -w

Également sur les systèmes avec systemd que vous pouvez utiliser :

journalctl -kf

57voto

djeikyb Points 901

Fais en sorte que ça marche.

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

Maintenant, si vous lisez le manuel de proc amical, il vous avertira sévèrement de laisser seulement un utilisateur (qui doit être privilégié) lire /proc/kmsg à la fois. Quelle que soit l'implémentation de syslog que vous avez, elle devrait faire cela, et vraisemblablement, elle fonctionne avec dmesg . Je ne sais pas, je ne suis pas dans mon élément ici, je ne fais que paraphraser le manuel. Donc, bien que cette méthode soit la plus simple, considérez d'abord les deux méthodes suivantes.

Page man approuvée : watch + dmesg

Sur une des machines linux que j'utilise avec systemd init*, le fichier dmesg.log n'est pas écrit très souvent, peut-être même pas du tout ? La meilleure façon que j'ai trouvée pour lire le tampon du journal du noyau en continu est avec watch . Voici un exemple de ce que vous pouvez faire (ajustez en fonction du nombre de lignes qui tiennent dans votre terminal) :

watch 'dmesg | tail -50'

watch + dmesg + daemon + tail -f

Une solution plus alambiquée pourrait utiliser watch pour écrire la sortie de dmesg dans un fichier, que vous pourriez alors tail -f . Vous voudrez probablement que cela fonctionne comme un démon. Un bon démon devrait aussi gzip et faire tourner les logs. Le code bash suivant n'a pas été testé, ne fonctionne pas, et n'est destiné qu'à donner une idée. La réponse de @Brooks Moses comporte un version de travail .

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

* Il s'agit d'une question sur un système d'exploitation de bureau Apple : lorsque systemd est présent, il n'est pas nécessaire de s'embarrasser de dmesg ; utiliser journalctl -xf (peut-être avec -n 100 pour afficher également les 100 lignes précédentes)

22voto

Kevin Peterson Points 382

Voici une variante de La réponse de djeikyb qui a été testé, 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 dmesg -c qui efface le tampon d'anneau après l'impression. Ainsi, à chaque fois, nous imprimons uniquement ce qui est nouveau depuis la dernière fois.

Pour ce faire, vous devez être root, d'où l'utilisation de l'option sudo . Il y a aussi une correction de bogue ; au lieu d'essayer de vider la sortie dans un fichier et de l'envoyer à tail (ce qui ne fonctionne pas), nous lisons simplement le fichier nouvellement écrit.

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

Vous pouvez aussi faire quelque chose de similaire qui ressemble plus à tail -f avec un while boucle qui exécute dmesg -c y sleep 1 pour toujours (voir la réponse de Ben Harris). Cependant, étant donné que cela efface le tampon de messages du noyau pendant l'exécution, vous voudrez peut-être aussi envoyer ces messages dans un fichier journal au cas où vous les voudriez plus tard.

8voto

Cela peut marcher pour vous

while true;do sudo dmesg -c;done

Gardez à l'esprit que l'option '-c' efface le tampon de messages dans la sortie standard. Le 'sudo' est inutile si vous êtes root. Si vous pensez que cela consomme trop de ressources CPU, essayez d'ajouter un 'sleep 1' avant que la boucle ne soit terminée.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X