183 votes

Est-il possible d'utiliser `tail -f` la sortie de `dmesg` ?

Je veux faire quelque chose comme

dmesg | tail -f

mais ça ne marche pas :

J'utilise Mac OS X v10.6.7 (Snow Leopard). En faisant cela, tail quittera, au lieu de surveiller la sortie.

Je me demande s'il existe un moyen de le faire, ou une commande équivalente.

P.S., je ne pense pas qu'un while boucle sera une assez bonne idée.

5voto

Je l'ai fait avant de voir ce post :

#!/usr/bin/env perl

use strict;
use warnings;

# "tail -f" for dmesg
# Keeps last printed line. Anything sorting "gt" will be newer

$|=1;

my $y = '';

while(1) {
    for my $k (`dmesg`) {
        if ($k gt $y) {
            print $k;
            $y = $k;
        }
    }
    sleep 1;
}
exit;

4voto

Dagelf Points 732

Voici quelques idées pour les environnements limités

Les environnements tels que les environnements embarqués ou pré-boot, où watch, tail, cat, dd et d'autres commandes ne sont pas disponibles, peuvent nécessiter une gymnastique différente.

C'est ce que font certaines distributions Linux légères :

while dmesg -c >> /tmp/dmesg.log; do sleep 0.1; done & tail -f /tmp/dmesg.log

Il met en arrière-plan la boucle while (avec &) tout en faisant suivre la sortie générée.

Si vous ne pouvez pas écrire sur /tmp :

mount -t tmpfs - /tmp 

# or 
mount -t ramfs - /tmp 

# or use /dev/shm instead of /tmp - which is available in newer environments

Si vous n'avez pas de queue, vous pouvez

cat /tmp/dmesg.log

# or 
dd if=/tmp/dmesg.log 

# or
dd if=/tmp/dmesg.log 2>/dev/null

Ou vous pouvez être dans un environnement busybox qui n'a pas de dmesg lié, alors juste :

busybox dmesg -c

Vous pouvez également avoir besoin de

busybox sleep

au lieu de dormir

Si vous n'avez pas le sommeil :

while dmesg -c; do echo >/dev/null; done 

Si vous n'avez pas "dmesg" :

while sleep 0.1; do cat -v /proc/kmsg; done

Cela ne fonctionne que si rien d'autre n'est lu à partir d'ici. Vous pouvez également avoir un /dev/kmsg.

Conseil bonus :

Si vous ne savez pas ce que vous avez, et que vous n'avez pas "ls", simplement :

busybox ls

# or simply:

echo *

3voto

Ed L Points 141

Vous pourriez être en mesure de le faire :

tail -f /var/log/messages

3voto

drgibbon Points 131

J'utilise cet alias dans /root/.bashrc ;

alias dwatch='watch -n 0.1 "dmesg | tail -n $((LINES-6))"'

qui suit dmesg et ajuste les lignes pour le terminal dans lequel il est appelé.

modifier : Comme beaucoup de gens l'ont fait remarquer, c'est aussi simple que dmesg -w depuis le noyau 3.5.0.

1voto

Bonus Kun Points 660

Que dites-vous de ça ?

dmesg | tail -f /dev/stdin

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X