当在服务器上执行压测的时候,会遇到进程后台已经执行完了,但是paramiko这边卡住的情况。看了文档及参考了codenong里面的代码,debug之后发现channel中的exit_status_ready,recv_ready, recv_stderr_ready始终是false的,并没有找到解决的办法。在github的paramiko目录下看到有类似的提问,没有解答。
while not stdout.channel.exit_status_ready():
time.sleep(10)
if stdout.channel.recv_ready():
och = stdout.channel.recv(1024)
while och:
stdoutResult += och.decode()
och = stdout.channel.recv(1024)
if stdout.channel.recv_stderr_ready():
ech = stdout.channel.recv_stderr(1024)
while ech:
stderrResult += och.decode()
ech = stdout.channel.recv_stderr(1024)
https://github.com/paramiko/paramiko/issues/1507
上面这里有提到一个方法,但没看懂要做的方式。目前的实现方式为命令后台执行
nohup command &
执行完会自动退出, 然后判断进程是否存在, 存在就sleep, 直到多少次后进程执行完毕, 然后根据日志最后的内容来判断是否正常执行完成。
------------------------------2022-09-23新增---------------------------------------------------------------------------
服务器这边需要设置两个参数,排查出来主要的原因是ssh会话过期导致的。paramiko这边其实是没有问题的,尝试增加了paramiko这边的set_keepalive, 但不是必要的。 服务器参数是必须的。需要修改的参数补充如下。
1、修改/etc/ssh/sshd_config配置文件中以下两个参数:
1)、ClientAliveInterval:设置为想要的时间,单位为秒,比如设置为60秒,则服务器每1分钟向客户端发送保持连接的请求。
2)、ClientAliveCountMax:此参数指服务器根据ClientAliveInterval时间间隔发送保持连接的请求时,如果发现客户端没有响应,则判断为一次超时,这个参数设置允许超时的次数。默认为3,客户端一般不会没响应,设置为默认值3即可。
假如ClientAliveInterval为60,ClientAliveCountMax为3,则实际的超时时间为60*3=3分钟。
修改之后需要重启sshd服务 systemctl restart sshd
参考:
https://docs.paramiko.org/en/2.6/api/transport.html#paramiko.transport.Transport.set_keepalive
https://www.codenong.com/14643861/
https://www.cnblogs.com/caesar-id/p/12873557.html
https://docs.paramiko.org/en/stable/api/channel.html
https://blog.csdn.net/donghustone/article/details/83054138