web-dev-qa-db-fra.com

Comment puis-je voir la sortie dmesg lorsqu'elle change?

J'écris un pilote de périphérique qui imprime un message d'erreur dans tampon en annea sortie dmesg. Je veux voir la sortie de dmesg lorsqu'elle change.

Comment puis-je faire ceci?

154
Milad Khajavi

Versions dmesg relativement récentes fournir une option de suivi (-w, --follow) qui fonctionne de manière analogue à tail -f.

Ainsi, utilisez simplement la commande suivante:

$ dmesg -wH

(-H, --human permet des fonctionnalités conviviales comme les couleurs, le temps relatif)

Ces options sont disponibles par exemple dans Fedora 19.

194
maxschlepzig

Vous pouvez utiliser la commande watch qui est destinée exactement à des choses comme celle-ci

watch -n 0.1 "dmesg | tail -n $((LINES-6))"

la partie $((LINES-6)) devrait l'adapter parfaitement à votre terminal.

57
peterph

Vous ne pouvez pas vraiment contrôler directement la sortie de dmesg.

Cependant, il y a de fortes chances que votre module n'imprime pas directement dans le tampon en anneau de dmesg, mais utilise à la place les fonctions de journalisation du noyau (qui seront ensuite affichées par dmesg). Si votre syslog a des paramètres raisonnables (par exemple, par défaut), ces messages apparaîtront très probablement également dans le kern.log fichier journal.

Vous pouvez donc faire quelque chose comme:

 tail -f /var/log/kern.log
12
umläute

Vous utilisez dmesg pour obtenir les messages de journal du noyau.

Le noyau lui-même se connecte dans un tampon en anneau, c'est-à-dire juste en mémoire. Maintenant, tout ce que dmesg fait est de sortir le contenu de ce tampon en anneau. Si tu fais dmesg -c il supprimera également le tampon en anneau par la suite.

Vous pouvez donc faire quelque chose comme while true; do dmesg -c; sleep 1; done pour avoir quelque chose comme l'équivalent d'un ne fonctionne pas dmesg|tail. Mais cela supprime le tampon en anneau et a donc besoin de pouvoirs root.

L'autre façon est le fichier /proc/kmsg qui permet une vue sur le tampon en anneau. Vous pourriez faire tail -f /proc/kmsg, mais cela ne permet qu'un seul processus, et c'est généralement votre démon de journalisation. - Son travail consiste à lire les messages et à les écrire dans de vrais fichiers (généralement dans/var/log) où ils peuvent être lus. Il peut être configuré pour sortir tous les messages dans un seul fichier ou différentes parties dans différents fichiers. (Mais la configuration dépend du démon de journalisation de votre système.)

Jetez donc un œil à /var/log s'il existe un fichier qui répond à vos besoins et configurez votre démon de journalisation dans le cas contraire.

10
michas

Si vous utilisez un système intégré, comme BusyBox qui est courant sur des systèmes comme OpenWrt , il a des fonctionnalités très limitées et seuls 2-3 indicateurs sont pris en charge.

Si vous voulez un moyen rapide et sale d'imprimer la sortie dmesg sur l'écran en continu à mesure que les événements changent, une simple boucle Bash fonctionne très bien. Ce n'est pas idéal, mais comme je l'ai mentionné, le dmesg BusyBox manque de nombreuses fonctions. Je trouve que ce qui suit a le même effet lorsqu'il est entré dans la ligne de commande:

$ while true; do dmesg -c ; sleep 1 ; done

Vous pouvez quitter la boucle avec Ctrl + C. Le sommeil 1 consiste à l'empêcher de frapper le processeur inutilement, et l'indicateur -c efface le tampon à chaque appel afin que vous ne voyiez pas de sortie répétée chaque seconde.

8
user241342

Sur les systèmes qui utilisent systemd, vous pouvez également:

# journalctl -kf
5
Maxim

Utilisez ces deux commandes à partir de terminaux distincts:

  1. while true; do dmesg -c >> test.txt;sleep 1; done
  2. tail -f test.txt

Il obtiendra un résultat similaire.

0
K_K