我正在研究一个python脚本,它通过拖尾文件然后放入一个不同的文件来读取数据。该脚本以时间限制的方式工作,并在到达ENDTIME时最终从缓冲区中刷新数据。但是,在大小方面,源文件和目标文件不匹配。
以下是一个片段:
self.read_size = 2048
self.tail_buffer = 2048
# start the file tail
cmd = '%s -f -o %s %s' % (self.jtailcmd, offset, self.source_journal)
self.logger.debug('[%s] starting FILE Tail' % self.getName())
try:
self.jtail = popen2.Popen3(cmd, bufsize = self.tail_buffer)
self.jtail.tochild.close()
out = self.jtail.fromchild
outfd = self.jtail.fromchild.fileno()
flags = fcntl.fcntl(outfd, fcntl.F_GETFL)
fcntl.fcntl(outfd, fcntl.F_SETFL, flags | os.O_NONBLOCK)
except:
message = '[%s] error reading file' % self.getName()
self.logger.error(message)
self.logger.error('[%s] %s: %s' % \
(self.getName(), sys.exc_info()[0], sys.exc_info()[1]))
send_alert('AE', message)
self.sleep(60)
self.close_tail()
self.close_ssh()
然后最终冲出数据:
try:
[i, o, e] = select.select([outfd], [], [], 1)
if i:
data = out.read(self.read_size)
else:
data = None
except:
message = '[%s] error reading file' % self.getName()
self.logger.error(message)
self.logger.error('[%s] %s: %s' % \
(self.getName(), sys.exc_info()[0], sys.exc_info()[1]))
send_alert('AE', message)
self.close_tail()
self.close_ssh()
self.sleep(60)
break
if data:
if self.sshcat.poll() != -1:
self.logger.error('[%s] connection error' % self.getName())
self.close_tail()
self.close_ssh()
break
try:
self.sshcat.tochild.writelines(data)
self.sshcat.tochild.flush()
except:
message = '[%s] error writing remote file' % self.getName()
排除故障时,我将问题缩小到tail_buffer
大小!通过减少tail_buffer
大小,脚本运行正常。
我不想依赖tail_buffer大小。理想情况下,脚本应该独立于它!
有没有办法从POPEN缓冲区刷新数据?
请帮忙!
答案 0 :(得分:0)
如果我正确理解您的问题,您可以考虑采用与此问题类似的方法:Reading from a frequently updated file
使用tail是一种黑客攻击。