Python 远程进程完成后中断 tail -f 进程

Python breaking out of tail -f process when remote process is done

我有两个进程运行

  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

根据设计 tail -f 当一个进程完成写入日志文件时不会退出(它真的不知道正在完成的日志和进程只需要很长时间才能完成之间的区别)写下一行)。如果您可以获得后台进程的 pid(例如通过使用 ps),您可能想要的是 tail -f --pid=PID。根据文档,这应该在具有进程 ID PID 的进程结束后终止 tail

此外,if not data_buffer 检查没有显示 No more data。如果 tail returns 没有将单个字节写入标准输出,则 if 条件只会为真,因为在读取并附加第一个非空行后 data_buffer 将是非空的。您可以改为检查 line,但由于您将 iter() 与标记值一起使用,因此这将是多余的。