Comment puis-je voir la sortie de dmesg à mesure qu'elle change?

141

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?

Milad Khajavi
la source
1
superuser.com/questions/289239/…
Ciro Santilli a annoncé

Réponses:

178

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.

maxschlepzig
la source
2
Belle trouvaille! Gentoo ne veut pas parler, -Hmais autrement sur place
unperson325680
Les outils d’espace utilisateur doivent être la version 2.22+. Les utilisateurs d'Ubuntu doivent attendre la version 14.10 "utopic"
Daniel Alder
1
Ubuntu ne veut pas parler -w - besoin de regarder (ci-dessous)
Brent Faust
2
Répondez à une réponse sysadmin qui utilise - flags de manière descriptive au lieu d’indicateurs cryptiques à un caractère. BRAVO, SIR. BRAVO.
allyourcode
1
-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
publication
54

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.

Peterph
la source
2
Si vous utilisez des guillemets simples au lieu de guillemets doubles (ou si vous échappez au signe dollar), vous obtiendrez une nouvelle valeur de $ LINES pour chaque invocation. Elle sera donc ajustée si vous modifiez la taille de votre terminal.
P Papa
Les guillemets simples inhiberont l'expansion des variables. De plus, la variable n'est développée qu'une seule fois dans cet exemple, à l'invocation de watch. Ainsi, cela ne changera pas vraiment entre les invocations de dmesg. Il faudrait utiliser un wrapper qui interrogerait l'état du terminal.
Peter
2
Exactement. Les guillemets simples interdisent le développement de la variable lorsque le shell passe les arguments 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.
P papa
Hmm, vous avez raison - je suppose que 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.
Peter
12

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
umläute
la source
/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.
Kurtm
2
tail -f /var/log/{messages,kernel,dmesg,syslog}via super-utilisateur: est-il-possible-à-queue-f-sortie-de-dmesg
ici
9

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.

michas
la source
//, Sur le système CEntOS 6 que j'utilise, le suivi et l'affichage / proc / kmsg ne produisent aucun résultat. [~] $ sudo tail -f / proc / kmsg ♥% [~] $ sudo chat / proc / kmsg ♥% [~] $
Nathan Basanese
8

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,

utilisateur241342
la source
1
Vraiment utile pour déboguer Android.
val
5

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

# journalctl -kf
Maxime
la source
1
Ubuntu 14.10: journal ~ journalctl -kf Aucun fichier journal n'a été trouvé.
Nathan Basanese
0

Utilisez ces 2 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.

K_K
la source
//, Ceci indique à dmesg d'ajouter la sortie à test.txt, n'est-ce pas? Et la deuxième commande surveille simplement ce fichier test.txt?
Nathan Basanese
Merci .. oui .. la 2e commande surveille les modifications apportées à dmesg. cat / proc / kmsg peut obtenir une sortie similaire mais il n'enregistre pas les journaux dans un fichier.
K_K