A sample implementation that monitors the logs that can be confirmed with dmesg, such as tail -F, for tail updates.
The ring buffer output by dmesg can be opened as a file by / dev / kmsg or / proc / kmsg.
Since it blocks with read on the last line, ʻO_NONBLOCK` is specified only when skipping is processed.
dmesg(/dev/kmsg)Update monitoring
#!/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 () when the last line is reached.The execution and its result are as follows.
Execution result and end(Monitoring side)
$ ./tailf.py
12,642,9584294872,-;aaa
12,643,9588998703,-;bbb
12,644,9593362017,-;ccc
### stop watch tailf ###
By redirecting to / dev / kmsg, the output of the driver log is confirmed in a pseudo manner.
Execution result and end(Update side sample)
$ 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
I didn't know a good way to seek to the last line of the file in python, so I implemented it by reading everything up to the last line. In the case of a huge file, it may take a long time just to skip it. (When changing the size of the ring buffer, etc.)
# FIXME
for last in fp:
    pass
Emerge Technology: Tail-like with Python Output the line containing the specified character string from the text file --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