解决paramiko执行命令超时的问题


Posted in Python onApril 16, 2020

问题:paramiko远程执行命令,需要等到命令返回信息,如果命令执行时间比较长,返回信息就需要等很久

方案:

1、使用nohup + 待执行命令 + & ,使用后台执行的方式,应该可以快速返回

2、设置paramiko的执行命令等待超时时间

stdin, stdout, stderr = self.client.exec_command(cmd,timeout=10,get_pty=True)

其实上面的两种方案都不可行:方案1,需要优化,下面这种直接调用的方式会导致test.sh启动不起来

stdin, stdout, stderr = self.client.exec_command(‘sh ~/test.sh &',get_pty=True)

方案2,对于需要等待很久的命令,如果timeout小于程序的执行时间,还是会失败,命令执行失败

最终的解决方案来自参考1

把执行很久的sh文件A放入另一个sh文件B中,然后paramiko执行文件B。摘录原文:

paramiko远程执行后台脚本“阻塞”问题

我写的远程命令通道上线之后,发现在远程脚本中后台再执行另一个脚本,通道会一直等待后台脚本执行完成才会返回,有时甚至会僵死。

1、复现过程如下:

①、编写测试脚本

脚本1:test.sh

#!/bin/bash
sleep 30
echo test end
exit 0

脚本2:run.sh

#!/bin/bash
bash /tmp/test.sh &
echo run ok!
exit 0

脚本3:test.py

import paramiko
client = paramiko.SSHClient()
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='192.168.1.10', port=22, username='root', password='123456', timeout=300,allow_agent=False,look_for_keys=False)       
stdin,stdout,stderr=client.exec_command("bash /tmp/run.sh") 
            
result_info = ""

for line in stdout.readlines():
 result_info += line

print result_info

将test.sh和run.sh传到远程服务器上,比如放到192.168.1.10:/tmp/下。

②、发起远程执行

在本地执行 python test.py,会发现整个脚本不会立即打印run ok,而是等30s之后才打印包括test.sh的所有输出信息。

2、解决办法

将远程脚本的标准输出stdout重定向到错误输出stderr即可,test.py 修改如下:

import paramiko
client = paramiko.SSHClient()
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='192.168.1.10', port=22, username='root', password='123456', timeout=300,allow_agent=False,look_for_keys=False)       
stdin,stdout,stderr=client.exec_command("bash /tmp/run.sh 1>&2") 
            
result_info = ""

for line in stderr.readlines():
 result_info += line

print result_info

现在执行,就能立即得到结果了。其实原因很简单,因为bash /tmp/test.sh & 虽然是后台执行,但是依然会产生标准输出,一旦产生标准输出,paramiko就会认为命令还未执行完成,且stdout的buffer大于stderr,因此产生等待问题。

这里只要将脚本执行的标准输出重定向到错误输出(1>&2),然后paramiko就可以使用stderr快速读取远程打屏信息了。

基于上面paramiko的原理:有stdout输出,就认为命令没有执行完成。得出下面的解决方案,对于需要执行很久test.sh,我们首先把标准输出都发给标准错误输出(1>&2),然后后台启动(&)

stdin, stdout, stderr = self.client.exec_command(‘bash ~/test.sh 1>&2 &',get_pty=True)

项目实践,还有下面的方案:去掉参数get_pty,这样就不会回传标准输出信息和标准错误信息

self.client.exec_command(‘bash ~/test.sh')

以上这篇解决paramiko执行命令超时的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解Python程序与服务器连接的WSGI接口
Apr 29 Python
详谈Python高阶函数与函数装饰器(推荐)
Sep 30 Python
python 对象和json互相转换方法
Mar 22 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
Jan 05 Python
PyTorch搭建多项式回归模型(三)
May 22 Python
python的几种矩阵相乘的公式详解
Jul 10 Python
python使用matplotlib绘制雷达图
Oct 18 Python
pygame实现打字游戏
Feb 19 Python
如何解决tensorflow恢复模型的特定值时出错
Feb 06 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
Apr 01 Python
解决Pytorch中关于model.eval的问题
May 22 Python
Python字符串的转义字符
Apr 07 Python
python nohup 实现远程运行不宕机操作
Apr 16 #Python
通过python 执行 nohup 不生效的解决
Apr 16 #Python
在python中使用nohup命令说明
Apr 16 #Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
Apr 16 #Python
python实现程序重启和系统重启方式
Apr 16 #Python
Mac PyCharm中的.gitignore 安装设置教程
Apr 16 #Python
jupyter notebook 重装教程
Apr 16 #Python
You might like
espresso double下 咖啡粉超细时 饼压力对咖啡的影响
2021/03/03 冲泡冲煮
MySQL相关说明
2007/01/15 PHP
php empty() 检查一个变量是否为空
2011/11/10 PHP
php循环语句 for()与foreach()用法区别介绍
2012/09/05 PHP
PHP中error_reporting()用法详解
2015/08/31 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
js onpropertychange输入框 事件获取属性
2009/03/26 Javascript
javascript 鼠标滚轮事件
2009/04/09 Javascript
jquery CSS选择器笔记
2010/03/29 Javascript
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
jQuery实现动画效果的简单实例
2014/01/27 Javascript
浏览器窗口大小变化时使用resize事件对框架不起作用的解决方法
2014/05/11 Javascript
js css 实现遮罩层覆盖其他页面元素附图
2014/09/22 Javascript
微信小程序 wx.request(接口调用方式)详解及实例
2016/11/23 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
vue全局使用axios的方法实例详解
2018/11/22 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
跟老齐学Python之赋值,简单也不简单
2014/09/24 Python
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
分享Pycharm中一些不为人知的技巧
2018/04/03 Python
python使用zip将list转为json的方法
2018/12/31 Python
python3+selenium自动化测试框架详解
2019/03/17 Python
Python range、enumerate和zip函数用法详解
2019/09/11 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
Python切片列表字符串如何实现切换
2020/08/06 Python
pycharm 添加解释器的方法步骤
2020/08/31 Python
什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
2013/07/26 面试题
网络专业学生个人的自我评价
2013/12/16 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
资源环境与城乡规划管理专业自荐书
2014/09/26 职场文书
大学生万能检讨书范例
2014/10/04 职场文书
黑暗中的舞者观后感
2015/06/18 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书