解决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 相关文章推荐
Python3.x和Python2.x的区别介绍
Feb 12 Python
python实现将元祖转换成数组的方法
May 04 Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
Jul 24 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
Oct 29 Python
Python2和Python3中urllib库中urlencode的使用注意事项
Nov 26 Python
浅谈pycharm的xmx和xms设置方法
Dec 03 Python
python 实现selenium断言和验证的方法
Feb 13 Python
python调用webservice接口的实现
Jul 12 Python
Python 切分数组实例解析
Nov 07 Python
PyQt5+python3+pycharm开发环境配置教程
Mar 24 Python
PyQt 如何创建自定义QWidget
Mar 24 Python
使用pandas生成/读取csv文件的方法实例
Jul 09 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
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
2021年最新CPU天梯图
2021/03/04 数码科技
我常用的几个类
2006/10/09 PHP
yii框架中的Url生产问题小结
2012/01/16 PHP
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
PHP使用Mysql事务实例解析
2014/09/08 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
cakephp常见知识点汇总
2017/02/24 PHP
php框架CodeIgniter主从数据库配置方法分析
2018/05/25 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
js实现通用的微信分享组件示例
2014/03/10 Javascript
jQuery使用hide方法隐藏元素自身用法实例
2015/03/30 Javascript
jQuery简单实现日历的方法
2015/05/04 Javascript
Bootstrap入门书籍之(三)栅格系统
2016/02/17 Javascript
jQuery web 组件 后台日历价格、库存设置的代码
2016/10/14 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
2017/07/03 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
vue中element组件样式修改无效的解决方法
2018/02/03 Javascript
js实现二级菜单点击显示当前内容效果
2018/04/28 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
小试小程序云开发(小结)
2019/06/06 Javascript
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
2020/08/14 Javascript
javascript实现固定侧边栏
2021/02/09 Javascript
.dcm格式文件软件读取及python处理详解
2020/01/16 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
伦敦剧院门票:From The Box Office
2018/06/30 全球购物
编写strcpy函数
2014/06/24 面试题
危货运输企业安全生产责任书
2014/07/28 职场文书
民主生活会发言材料
2014/10/20 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
小型婚礼主持词
2015/06/30 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书
前端监听websocket消息并实时弹出(实例代码)
2021/11/27 Javascript