Python 远程进程完成后中断 tail -f 进程
Python breaking out of tail -f process when remote process is done
我有两个进程运行
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
?
根据设计 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()
与标记值一起使用,因此这将是多余的。
我有两个进程运行
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
?
根据设计 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()
与标记值一起使用,因此这将是多余的。