2013-10-24 70 views
3

我試圖檢查正在運行的嵌入式系統的日誌文件中的錯誤。tail -f通過ssh與Paramiko有一個遞增的延遲

我已經在我的腳本中實現了paramiko,因爲我被告知這是在python中使用ssh的最佳方式。

現在,當我尾巴的日誌文件,我看到有一個很大的延遲建立。隨着每分鐘約30秒增加。

我已經使用了一個grep來減少打印的行數,因爲我認爲我收到了太多的輸入,但事實並非如此。

如何減少延遲或阻止延遲在運行時增加。我想尾巴小時...

def mkssh_conn(addr): 
    """returns an sshconnection""" 
    paramiko.util.logging.getLogger('paramiko').setLevel(logging.WARN) 
    sshcon = paramiko.SSHClient() 
    sshcon.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    sshcon.connect(addr , username, password) 
    return sshcon 

while True: 
    BUF_SIZE = 1024 
    client = mkssh_conn() #returns a paramiko.SSHClient() 
    transport = client.get_transport() 
    transport.set_keepalive(1) 
    channel = transport.open_session() 
    channel.settimeout(delta) 
    channel.exec_command('killall tail') 
    channel = transport.open_session() 
    channel.settimeout(delta) 
    cmd = "tail -f /log/log.log | grep -E 'error|statistics'" 
    channel.exec_command(cmd) 
    while transport.is_active(): 
     print "transport is active" 
     rl, wl, xl = select.select([channel], [], [], 0.0) 
     if len(rl) > 0: 
      buf = channel.recv(BUF_SIZE) 
      if len(buf) > 0: 
       lines_to_process = LeftOver + buf 
       EOL = lines_to_process.rfind("\n") 
       if EOL != len(lines_to_process)-1: 
        LeftOver = lines_to_process[EOL+1:] 
        lines_to_process = lines_to_process[:EOL] 
       else: 
        LeftOver = "" 
       for line in lines_to_process.splitlines(): 
        if "error" in line: 
         report_error(line) 
        print line 
    client.close()   

回答

3

我已經找到了解決辦法: 看來,如果我下BUF_SIZE 256的延遲降低。明顯。 如果延遲在運行時間內仍然增加,我需要重新檢查。

+1

它沒有發生 – studioj