J'écris un pilote de périphérique qui imprime un message d'erreur dans la sortie dmesg du tampon circulaire. Je veux voir la sortie de dmesg
comme cela change.
Comment puis-je faire ceci?
J'écris un pilote de périphérique qui imprime un message d'erreur dans la sortie dmesg du tampon circulaire. Je veux voir la sortie de dmesg
comme cela change.
Comment puis-je faire ceci?
Réponses:
Les dmesg
versions relativement récentes fournissent 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.
-H
mais autrement sur place
-w
devrait fonctionner dans toutes les versions d’Ubuntu à partir d’Utopic (14.10). ( launchpad.net/ubuntu/+source/util-linux/+publishinghistory suggère que les premiers paquets Utopic étaient à 2.20, mais atteignaient 2,25 à la date de
Vous pouvez utiliser la watch
commande qui est exactement destinée à des choses comme celle-ci
watch -n 0.1 "dmesg | tail -n $((LINES-6))"
la $((LINES-6))
pièce doit bien s’adapter parfaitement à votre terminal.
watch
. Ainsi, cela ne changera pas vraiment entre les invocations de dmesg
. Il faudrait utiliser un wrapper qui interrogerait l'état du terminal.
watch
. Par conséquent, watch exécutera la commande contenant l'expression de la variable, qui sera développée par le shell qu'il appelle. Chaque fois. Essayez, ça marche.
watch
uses popen()
, ce qui signifie qu'un autre shell est créé et que la variable d'environnement est ensuite fournie par celui-ci (et donc mise à jour à chaque exécution). Belle trouvaille.
vous ne pouvez pas vraiment surveiller la sortie de dmesg
directement.
Cependant, il y a de fortes chances que votre module n'imprime pas directement dans le tampon circulaire de dmesg, mais utilise plutôt les fonctions de journalisation du noyau (qui seront ensuite affichées par dmesg
). si vous avez des syslog
paramètres sains (par exemple, par défaut), ces messages apparaîtront probablement aussi dans le kern.log
fichier journal.
afin que vous puissiez faire quelque chose comme:
tail -f /var/log/kern.log
/var/log/kern.log
est assez spécifique à Linux. Pour OpenBSD (et éventuellement d’autres), le contenu de dmesg est enregistré dans / var / log / messages. Certes, d'autres choses y vont aussi.
tail -f /var/log/{messages,kernel,dmesg,syslog}
via super-utilisateur: est-il-possible-à-queue-f-sortie-de-dmesg
Vous utilisez dmesg
pour obtenir des messages de log du noyau.
Le noyau lui-même se connecte à un tampon en anneau, c'est-à-dire juste en mémoire. Désormais, tout ce qu’il dmesg
fait est de sortir le contenu de ce tampon circulaire. Si vous le faites, dmesg -c
cela supprimera également le tampon de sonnerie par la suite.
Par conséquent, vous pourriez faire quelque chose comme while true; do dmesg -c; sleep 1; done
avoir quelque chose comme l’équivalent d’un non-travail dmesg|tail
. Mais ceci supprime le tampon circulaire et nécessite donc des pouvoirs de racine.
L’autre méthode est le fichier /proc/kmsg
qui permet de visualiser le tampon en anneau. Vous pouvez le faire tail -f /proc/kmsg
, mais ceci n’autorise qu’un seul processus, et il s’agit généralement de 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 exporter tous les messages dans un seul fichier ou dans différentes parties dans différents fichiers. (Mais la configuration dépend du démon de journalisation de votre système.)
Par conséquent, vérifiez /var/log
si un fichier convient à vos besoins et configurez autrement votre démon de journalisation.
Si vous utilisez un système intégré, la busybox commune aux systèmes comme OpenWRT a des fonctionnalités très limitées et seuls 2 ou 3 indicateurs sont pris en charge.
Si vous voulez un moyen rapide et sale d’imprimer continuellement la sortie de dmesg à l’écran à mesure que les événements changent, une simple boucle bash fonctionne correctement. Ce n'est pas idéal, mais comme je l'ai mentionné, il manque beaucoup de fonctions au dmesg de BusyBox. 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 inutilement le processeur, et le drapeau -c efface le tampon à chaque appel, de sorte que vous ne voyez pas de sortie répétée toutes les secondes,
Sur les systèmes qui utilisent, systemd
vous pouvez également:
# journalctl -kf
Utilisez ces 2 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.