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é.
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,
fp.readline ()
lorsque la dernière ligne est atteinte.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
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