从Popen缓冲区中清除数据

时间:2014-01-17 15:04:41

标签: python python-2.7 python-3.x popen python-2.x

我正在研究一个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缓冲区刷新数据?

请帮忙!

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您可以考虑采用与此问题类似的方法:Reading from a frequently updated file

使用tail是一种黑客攻击。