解决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中使用 Selenium 实现网页截图实例
Jul 18 Python
Python实现遍历数据库并获取key的值
May 17 Python
探究Python中isalnum()方法的使用
May 18 Python
Python实现数通设备端口使用情况监控实例
Jul 15 Python
使用PyCharm配合部署Python的Django框架的配置纪实
Nov 19 Python
SQLite3中文编码 Python的实现
Jan 11 Python
python中字符串类型json操作的注意事项
May 02 Python
Python 实现数据库(SQL)更新脚本的生成方法
Jul 09 Python
通过Python实现自动填写调查问卷
Sep 06 Python
Django实现支付宝付款和微信支付的示例代码
Jul 25 Python
python2.7使用plotly绘制本地散点图和折线图
Apr 02 Python
基于Python中的yield表达式介绍
Nov 19 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
php Smarty date_format [格式化时间日期]
2010/03/15 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
php中的curl_multi系列函数使用例子
2014/07/29 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
微信支付之JSAPI公众号支付详解
2019/05/15 PHP
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
javascript中验证大写字母、数字和中文
2014/01/15 Javascript
jQuery实现淡入淡出二级下拉导航菜单的方法
2015/08/28 Javascript
浅谈JS中json数据的处理
2016/06/30 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
2016/11/16 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
简单谈谈JS中的正则表达式
2017/09/11 Javascript
详解Vue单元测试case写法
2018/05/24 Javascript
关于单文件组件.vue的使用
2018/09/20 Javascript
每天学点Vue源码之vm.$mount挂载函数
2019/03/11 Javascript
python 迭代器和iter()函数详解及实例
2017/03/21 Python
pycharm访问mysql数据库的方法步骤
2019/06/18 Python
用python求一个数组的和与平均值的实现方法
2019/06/29 Python
Python Opencv任意形状目标检测并绘制框图
2019/07/23 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
基于Python的图像数据增强Data Augmentation解析
2019/08/13 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
2020/09/29 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
小蚁科技官方商店:YI Technology
2019/08/23 全球购物
群众路线调研报告范文
2014/11/03 职场文书
行政复议决定书
2015/06/24 职场文书
2016年寒假家长评语
2015/10/10 职场文书
青年岗位能手事迹材料(2016推荐版)
2016/03/01 职场文书
班组长如何制订适合本班组的工作计划?
2019/07/10 职场文书
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers
mysql中如何用命令创建联合唯一索引
2022/04/20 MySQL
Mysql 文件配置解析介绍
2022/05/06 MySQL