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 dmesgcomme 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 dmesgcomme cela change.
Comment puis-je faire ceci?
Réponses:
Les dmesgversions 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, --humanpermet des fonctionnalités conviviales comme les couleurs, le temps relatif)
Ces options sont disponibles par exemple dans Fedora 19.
-Hmais autrement sur place
-wdevrait 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 watchcommande 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.
watchuses 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 dmesgdirectement.
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 syslogparamètres sains (par exemple, par défaut), ces messages apparaîtront probablement aussi dans le kern.logfichier journal.
afin que vous puissiez faire quelque chose comme:
tail -f /var/log/kern.log
/var/log/kern.logest 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 dmesgpour 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 dmesgfait est de sortir le contenu de ce tampon circulaire. Si vous le faites, dmesg -ccela 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; doneavoir 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/kmsgqui 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/logsi 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, systemdvous pouvez également:
# journalctl -kf
Utilisez ces 2 commandes à partir de terminaux distincts:
while true; do dmesg -c >> test.txt;sleep 1; donetail -f test.txtIl obtiendra un résultat similaire.