paramiko执行较长时间出现卡住的情况记录

当在服务器上执行压测的时候,会遇到进程后台已经执行完了,但是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
paramiko是一个用于Python的SSH客户端库,它可以用来在远程服务器执行命令。你可以使用paramiko执行k8s相关的命令,例如部署、管理和监控k8s集群。为了使用paramiko执行k8s命令,你需要执行以下几个步骤: 1. 安装paramiko库: 首先,你需要确保已经安装了paramiko库。你可以使用pip命令来安装paramiko,例如pip install paramiko。 2. 创建SSH连接: 使用paramiko的Transport类,你可以创建一个SSH连接到目标服务器。你可以指定服务器的IP地址和端口号,并提供登录凭据,例如用户名和密码或私钥。 3. 执行k8s命令: 一旦你成功建立SSH连接,你可以使用paramiko的SSHClient类的execute方法执行k8s命令。你可以将k8s命令作为字符串参数传递给execute方法,并通过调用stdout.read()方法来获取命令的输出结果。 下面是一个示例代码,演示了如何使用paramiko执行k8s命令: ```python import paramiko # 创建SSH连接 transport = paramiko.Transport(('192.168.11.181', 22)) transport.connect(username='your_username', password='your_password') # 创建SSH客户端 client = paramiko.SSHClient() client._transport = transport # 执行k8s命令 stdin, stdout, stderr = client.exec_command('kubectl get pods') output = stdout.read().decode('utf-8') # 打印输出结果 print(output) # 关闭SSH连接 client.close() ``` 在这个示例中,我们首先创建了一个SSH连接到目标服务器,然后创建了一个SSH客户端,并将其与SSH连接关联起来。接下来,我们使用SSH客户端的exec_command方法执行了一个k8s命令,即kubectl get pods,并通过stdout.read()方法获取了命令的输出结果。最后,我们打印了输出结果,并关闭了SSH连接。 这样,你就可以使用paramiko执行k8s命令了。请根据你的具体情况进行相应的修改和调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值