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?
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.
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.
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
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.
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.
Sur les systèmes qui utilisent systemd
, vous pouvez également:
# journalctl -kf
Utilisez ces deux commandes à partir de terminaux distincts:
while true; do dmesg -c >> test.txt;sleep 1; done
tail -f test.txt
Il obtiendra un résultat similaire.