我一直在寻找并在这个问题上愚弄这个问题2天了。首先,以(汇总)代码的形式提供一些上下文。
def setService(self, ...
ssh_client = self.conn.get_ssh_client(hostname, username=username, password=password)
setCommand = str('service ' + service_name + ' ' + status)
stdin, stdout, stderr = ssh_client.exec_command(setCommand)
# time.sleep(2)
return ...
其次。整个代码集使用相同的代码,除了这个“service foobar stop”和“service foobar start”命令之外,一切都有效。它会导致读取错误(在ssh / auth.log中)并且实际上不会影响该命令。使用此设置的所有其他命令工作正常(我们做了大约10个不同的命令)。它发生在所有目标机器上,来自两台开发机器,因此我排除了ssh配置。
但是,如果我在exec_command(在注释位置)之后添加任何时间延迟代码,它就可以工作。 sleep(2)或执行某些调试打印的循环使其工作正常。读取错误从auth.log和服务启动/停止中消失。取消睡眠或其他任何可能会再次打破睡眠。
我们通过在那里休眠来“修复”修复它,但我不完全理解它为什么会发生,或者为什么在函数中停止修复它。
我们回来太快了,在远程方面执行完毕之前?我不这么认为,它似乎是阻塞(返回stdin,stderr,stdout)。
对此的任何建议都将受到高度赞赏。
答案 0 :(得分:2)
注意: exec_command(command)
为non-blocking
..
我通常会尝试read
来自缓冲区的输出(这会消耗一些时间 - 在返回之前),或者我使用您在这种情况下使用的time.sleep
。
如果您使用(应该)stdout.read()/readlines()
,它会强制您的脚本返回stdout
缓冲区中的输出,然后等待exec_command
完成。