Mise à jour de la surveillance de dmesg (/ dev / kmsg) à partir de python sous Linux

Un exemple d'implémentation qui surveille les mises à jour de queue comme tail -F pour les journaux qui peuvent être vérifiés avec dmesg. La sortie du tampon en anneau par dmesg peut être ouverte sous forme de fichier par / dev / kmsg ou / proc / kmsg. Puisqu'il est bloqué par read sur la dernière ligne, ʻO_NONBLOCK` n'est spécifié que lorsque le saut est traité.

la mise en oeuvre

dmesg(/dev/kmsg)Suivi des mises à jour


#!/usr/bin/env python2
# cofing: UTF-8

import os
import fcntl
import time

def readLines(path):
    with open(path, "r") as fp:
        stat = os.stat(path)
        fp.seek(stat[6])

        where = None

        # =================
        # seek to last line
        # =================
        fd   = fp.fileno()
        flag = fcntl.fcntl(fd, fcntl.F_GETFL)
        fcntl.fcntl(fd, fcntl.F_SETFL, flag | os.O_NONBLOCK)

        try:
            # FIXME
            for last in fp:
                pass
        except IOError as e:
            if e.errno != 11:
                raise

        fcntl.fcntl(fd, fcntl.F_SETFL, flag)

        # =================
        # tailf impl
        # =================
        try:
            while True:
                where = fp.tell()
                line  = fp.readline()
                yield line
        except KeyboardInterrupt:
            pass

if __name__ == "__main__":
    import sys
    for line in readLines("/dev/kmsg"):
        if str(line).find("stop tailf") >= 0:
            print "### stop watch tailf ###"
            break
        else:
            print line,

L'exécution et son résultat sont les suivants.

Résultat et fin de l'exécution(Côté surveillance)


$ ./tailf.py
12,642,9584294872,-;aaa
12,643,9588998703,-;bbb
12,644,9593362017,-;ccc
### stop watch tailf ###

En redirigeant vers / dev / kmsg, la sortie du journal du pilote est confirmée de manière pseudo.

Résultat et fin de l'exécution(Mettre à jour l'échantillon latéral)


$ sudo sh -c "echo aaa > /dev/kmsg"
$ sudo sh -c "echo bbb > /dev/kmsg"
$ sudo sh -c "echo ccc > /dev/kmsg"
$ sudo sh -c "echo stop tailf > /dev/kmsg"

TODO

Je ne connaissais pas un bon moyen de rechercher la dernière ligne du fichier avec python, alors je l'ai implémenté en lisant tout jusqu'à la dernière ligne. Dans le cas d'un fichier volumineux, le simple fait de l'ignorer peut prendre un certain temps. (Lors de la modification de la taille du tampon en anneau, etc.)

# FIXME
for last in fp:
    pass

référence

Technologie Emerge: Queue avec Python Sortie de la ligne contenant la chaîne de caractères spécifiée à partir du fichier texte --Qiita python - What is the most efficient way to get first and last line of a text file? - Stack Overflow Get last n lines of a file with Python, similar to tail - Stack Overflow python Non-block read file - Stack Overflow

Recommended Posts

Mise à jour de la surveillance de dmesg (/ dev / kmsg) à partir de python sous Linux
Mettre à jour Mac Python de 2 à 3
Au moment de la mise à jour de python avec ubuntu
Mettre à jour vscode sur Linux
Mettez la dernière version de Python dans Linux (Debian) du Chromebook
Mise à jour automatique du module Python
Manipulation de python sur mac
Mettez à jour le python que vous aviez sur votre Mac à 3.7-> 3.8
Affichage en temps réel de la vidéo acquise à partir de la caméra Web sur le notebook Jupyter (Python3)
[Python] Obtenir la date de mise à jour d'un article d'actualité à partir de HTML
Installation à partir des sources de python, numpy, scipy sans privilèges root sur Linux
Comment mettre à jour la version Python de Cloud Shell dans GCP
Installez Python Pillow sur Amazon Linux
Remarques sur l'utilisation de MeCab depuis Python
Achèvement de la commande docker sous Linux
Construire un environnement pour python3.8 sur Mac
Remarques sur l'accès à dashDB à partir de python
Présentation de l'environnement Python 3.5.2 sur Amazon Linux
python> os.path.join ('data', 'checkpoint')> 'data / checkpoint' sous linux
Appeler C / C ++ depuis Python sur Mac
Intégration de données depuis l'application Python sur Linux vers Amazon Redshift avec ODBC
Exécuter un lot de Python 2.7 avec nohup sur Amazon Linux AMI sur EC2
De la construction de ré-environnement de Python au dessin graphique (sur le code Visual Studio)
Récupérer les frappes de / dev / input (python evdev)
Comment mettre à jour Google Sheets à partir de Python
Notes d'apprentissage depuis le début de Python 1
Obstrué par la mise à jour Python de la console GCP ①
[C] [python] Lire avec AquesTalk sous Linux
Comment mettre à jour PHP sur Amazon Linux 2
Utilisation de base de Btrfs dans Arch Linux
Connexion de python à MySQL sur CentOS 6.4
Comment mettre à jour la sécurité sur CentOS Linux 8
Étude sur Tokyo Rent en utilisant Python (3-1 sur 3)
[Amazon Linux] Passage de la série Python 2 à la série Python 3
[Python] Localisation japonaise de matplotlib sur Ubuntu
Notes d'apprentissage depuis le début de Python 2
Installez Python 3.8, Pip 3.8 sur EC2 (Amazon Linux 2)
Résolution de l'erreur Linux «Install on / dev / sda»