#!/usr/bin/env python
import optparse
import os
import sys
import time
class Error(Exception): pass
class FileError(Error): pass
class Tail(object):
def __init__(self, path, sleep=1.0, reopen_count=5):
self.path = path
self.sleep = sleep
self.reopen_count = reopen_count
def __iter__(self):
while True:
pos = self.file.tell()
line = self.file.readline()
if not line:
self.wait(pos)
else:
yield line
def open(self, tail=True):
try:
self.real_path = os.path.realpath(self.path)
self.inode = os.stat(self.path).st_ino
except OSError, error:
raise FileError(error)
try:
self.file = open(self.real_path)
except IOError, error:
raise FileError(error)
if tail:
self.file.seek(0, 2)
def close(self):
try:
self.file.close()
except Exception:
pass
def reopen(self):
self.close()
reopen_count = self.reopen_count
while reopen_count >= 0:
reopen_count -= 1
try:
self.open(tail=False)
return True
except FileError:
time.sleep(self.sleep)
return False
def check(self, pos):
try:
if self.real_path != os.path.realpath(self.path):
return True
stat = os.stat(self.path)
if self.inode != stat.st_ino:
return True
if pos > stat.st_size:
return True
except OSError:
return True
return False
def wait(self, pos):
if self.check(pos):
if not self.reopen():
raise Error('Unable to reopen file: %s' % self.path)
else:
self.file.seek(pos)
time.sleep(self.sleep)
tail
最新推荐文章于 2022-10-17 22:39:22 发布