完成远程进程后,Python退出tail -f进程

时间:2018-08-22 21:02:26

标签: python buffer paramiko readline tail

我有两个运行的进程

  1. exeAPI(在后台运行nohup
  2. tail -f server.log输出远程服务器日志

我能够成功将输出刷新到我的python客户端控制台,如下所示:

@bp.route('/executeAPI', methods=['GET', 'POST'])
def executeAPI():

    ...
    (ssh set up params)

    print('started...')
    data_buffer = ""
    stdin_run, stdout_run, stderr_run = client.exec_command('nohup echo source "exeAPI" | nc 127.0.0.1 40000 &')

    stdin, stdout, stderr = client.exec_command('tail -n 1 -f /home/server.log', get_pty=True)

    for line in iter(lambda: stdout.readline(1024), ""):
        data_buffer += line
        print(line, end="")
        if not data_buffer:          # never hits this if statement
            print('No more data')
            break

    print('finished.')
    client.close()

    return data_buffer

但是,输出完成后,它永远不会退出for loop

在没有换行符时,如何突破for loop

1 个答案:

答案 0 :(得分:3)

通过设计tail -f不会在一个进程完成向日志文件的写入时退出(它并不真正知道正在完成的日志与该进程仅花费很长时间来写入日志之间的区别下一行)。如果您可以获得后台进程的pid(例如,通过使用tail -f --pid=PID),则可能想要的是ps。根据文档,此操作应在进程ID为PID的进程死亡后tail终止。

此外,if not data_buffer检查不指示No more data。如果条件tail返回时没有向标准输出写入单个字节,则if条件将为true,因为在读取并附加了第一条非空行之后,data_buffer将为非空。您可以改为检查line,但是由于您正在使用带有定点值的iter(),因此这是多余的。