【发布时间】:2014-01-17 15:04:41
【问题描述】:
我正在编写一个 python 脚本,该脚本通过拖尾文件读取数据,然后放入不同的文件。该脚本以时间限制的方式工作,并最终在到达 ENDTIME 时从缓冲区中清除数据。但是,源文件和目标文件的大小不匹配。
下面是一个sn-p:
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 缓冲区刷新数据?
请帮忙!
【问题讨论】:
-
如果你减少了
tail_buffer并且代码开始正常工作,那么剩下的问题是什么? -
我不想依赖tail_buffer的大小。基本上脚本应该独立于它!
-
有没有更高效的方式从文件中读取数据?
-
您是否尝试过在这一行将 bufsize 设置为 0:
self.jtail = popen2.Popen3(cmd, bufsize = self.tail_buffer)?如果不指定,bufsize 默认为 0。听起来该命令可能正在等待缓冲区在返回之前被填充。这可以解释为什么当您使用较小的缓冲区时它会更快地返回。
标签: python python-2.7 python-3.x popen python-2.x