Eine Beispielimplementierung, die Tail-Updates wie "tail -F" auf Protokolle überwacht, die mit "dmesg" überprüft werden können.
Der von dmesg
ausgegebene Ringpuffer kann als Datei von / dev / kmsg
oder / proc / kmsg
geöffnet werden.
Da es in der letzten Zeile mit "Lesen" blockiert, wird "O_NONBLOCK" nur angegeben, wenn das Überspringen verarbeitet wird.
dmesg(/dev/kmsg)Update-Überwachung
#!/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 ()
endet, wenn die letzte Zeile erreicht ist.Die Ausführung und das Ergebnis sind wie folgt.
Ausführungsergebnis und Ende(Überwachungsseite)
$ ./tailf.py
12,642,9584294872,-;aaa
12,643,9588998703,-;bbb
12,644,9593362017,-;ccc
### stop watch tailf ###
Durch Umleiten nach "/ dev / kmsg" wird die Ausgabe des Treiberprotokolls pseudo bestätigt.
Ausführungsergebnis und Ende(Seitenbeispiel aktualisieren)
$ 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
Ich kannte keinen guten Weg, um mit Python in die letzte Zeile der Datei zu gelangen, also habe ich sie implementiert, indem ich alles bis zur letzten Zeile gelesen habe. Bei einer großen Datei kann das Überspringen sehr lange dauern. (Beim Ändern der Größe des Ringpuffers usw.)
# FIXME
for last in fp:
pass
Emerge-Technologie: Schwanzartig mit Python Ausgabe der Zeile mit der angegebenen Zeichenfolge aus der Textdatei --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