【发布时间】:2017-02-24 06:52:55
【问题描述】:
我想在远程服务器上运行一些软件的自动部署。无论如何,远程命令的输出总是阻塞并且永远不会结束。我已经检查了远程服务器,并且可以确认命令仍在运行,尽管 paramiko 打印的标准输出会阻塞。
我已经阅读了这篇文章的解决方案:LINK
import paramiko
import select
client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect('host.example.com')
channel = client.get_transport().open_session()
channel.exec_command("packstack --allinone")
while True:
if channel.exit_status_ready():
break
rl, wl, xl = select.select([channel], [], [], 0.0)
if len(rl) > 0:
print channel.recv(1024)
每次我使用Ctrl + C强制脚本停止时,似乎卡在rl, wl, xl = select.select([channel], [], [], 0.0)。
作为参考,我还阅读了this 帖子。但没有找到运气。
如何修改代码以使其与持久且输出量大的命令一起使用?
现在我发现了问题。
实际上它并没有停留在rl, wl, xl = select.select([channel], [], [], 0.0)。由于timeout 设置为0.0,因此它处于非阻塞模式。
因此,问题在于,程序永远执行了while 循环,但它无法从channel 接收任何内容,尽管远程进程仍在输出内容。
我认为这可能是由 paramiko 或坏的远程服务器引起的。
现在我的解决方案是当频道在有限的时间内(比如 120 秒)无法接收到任何东西,而没有收到退出信号时重新运行我的命令。
【问题讨论】:
-
试试
exec_command("for i in 1 2 3 4 5; do echo $i; sleep 1; done"),看看它是否适合你。 -
@whjm 我试过了。输出是正确的,它永远不会挂起。