python输出运行时间_Python Paramiko超时执行时间长,需要完整输出

本文探讨了使用Python的Paramiko库在远程服务器上执行长时间命令时遇到的超时和完整输出问题。作者尝试了设置通道超时、时间戳超时以及select.select方法来捕获和读取输出,但都未能在命令执行超时时得到完整输出。代码示例展示了作者的各种尝试和观察结果。

有很多主题涉及标题的一部分,但没有任何东西可以完全满足整个事情.我在远程服务器上推送一个命令,经过很长的执行时间后需要完整的输出,比如5分钟左右.使用通道我能够设置超时,但是当我读回stdout时,我只得到了一小部分输出.解决方案似乎是等待channel.exit_status_ready().这对成功的呼叫起作用,但是失败的呼叫永远不会触发信道超时.在查看了文档之后,我推测这是因为超时仅适用于读取操作,并且等待退出状态不符合条件.这是尝试:

channel = ssh.get_transport().open_session()

channel.settimeout(timeout)

channel.exec_command(cmd) # return on this is not reliable

while True:

try:

if channel.exit_status_ready():

if channel.recv_ready(): # so use recv instead...

output = channel.recv(1048576)

break

if channel.recv_stderr_ready(): # then check error

error = channel.recv_stderr(1048576)

break

except socket.timeout:

print("SSH channel timeout exceeded.")

break

except Exception:

traceback.print_exc()

break

漂亮,不是吗?希望它有效.

我首次尝试解决方案是使用time.time()来开始,然后检查start – time.time()>超时.这看起来很简单,但在我目前的版本中,我输出start-time.time(),其中一个固定的超时应该触发一个中断…并且看到差异使得超时加倍并且不会发生中断.为了节省空间,我会提到我的第三次尝试,我已经用这个尝试了.我在这里读到关于使用select.select等待输出的问题,并在文档中注意到那里也有超时.正如您将从下面的代码中看到的那样,我混合了所有三种方法 – 通道超时,time.time超时和选择超时 – 但仍然必须终止进程.这是frankencode:

channel = ssh.get_transport().open_session()

channel.settimeout(timeout)

channel.exec_command(cmd) # return on this is not reliable

print("{0}".format(cmd))

start = time.time()

while True:

try:

rlist, wlist, elist = select([channel], [], [],

float(timeout))

print("{0}, {1}, {2}".format(rlist, wlist, elist))

if rlist is not None and len(rlist) > 0:

if channel.exit_status_ready():

if channel.recv_ready(): # so use recv instead...

output = channel.recv(1048576)

break

elif elist is not None and len(elist) > 0:

if channel.recv_stderr_ready(): # then check error

error = channel.recv_stderr(1048576)

break

print("{0} - {1} = {2}".format(

time.time(), start, time.time() - start))

if time.time() - start > timeout:

break

except socket.timeout:

print("SSH channel timeout exceeded.")

break

except Exception:

traceback.print_exc()

break

这是一些典型的输出:

[>], [], []

1352494558.42 - 1352494554.69 = 3.73274183273

顶行是select的[rlist,wlist,elist],底行是time.time() – start =(time.time() – start).通过计算迭代次数并在循环1000次后尝试在底部打破,我得到了这个运行.样本运行时超时设置为3.这证明我们通过了尝试,但显然,三种方式都不应该超时.

如果我从根本上误解了某些东西,请随意撕掉代码.我希望这是超级 – Pythonic,我还在学习.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值