我有两个运行的进程
exeAPI
(在后台运行nohup
)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
?
答案 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()
,因此这是多余的。