解决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实现一个简单的MySQL类
Jan 07 Python
在Python中调用ggplot的三种方法
Apr 08 Python
Python 20行简单实现有道在线翻译的详解
May 15 Python
python关于矩阵重复赋值覆盖问题的解决方法
Jul 19 Python
Python 等分切分数据及规则命名的实例代码
Aug 16 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
Feb 29 Python
Python unittest 自动识别并执行测试用例方式
Mar 09 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
Apr 08 Python
python中类与对象之间的关系详解
Dec 16 Python
Python基础详解之描述符
Apr 28 Python
详解python字符串驻留技术
May 21 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
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
PHP 存取 MySQL 数据库的一个例子
2006/10/09 PHP
如何使用脚本模仿登陆过程
2006/11/22 PHP
使用adodb lite解决问题
2006/12/31 PHP
php初始化对象和析构函数的简单实例
2014/03/11 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
PHP中常见的缓存技术实例分析
2015/09/23 PHP
基于PHP实现栈数据结构和括号匹配算法示例
2017/08/10 PHP
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
2007/05/14 Javascript
JavaScript OOP类与继承
2009/11/15 Javascript
网页防止tab键的使用快速解决方法
2013/11/07 Javascript
动态加载iframe时get请求传递中文参数乱码解决方法
2014/05/07 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
2015/12/08 Javascript
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
详解webpack 如何集成第三方js库
2017/06/29 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
详解RequireJs官方使用教程
2017/10/31 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
swiper实现异形轮播效果
2019/11/28 Javascript
vue-cli4.x创建企业级项目的方法步骤
2020/06/18 Javascript
Python中用Descriptor实现类级属性(Property)详解
2014/09/18 Python
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
对Python协程之异步同步的区别详解
2019/02/19 Python
python实现超市商品销售管理系统
2019/11/22 Python
python实现udp传输图片功能
2020/03/20 Python
如何在python中实现线性回归
2020/08/10 Python
python pygame 愤怒的小鸟游戏示例代码
2021/02/25 Python
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
台湾生鲜宅配:大口市集
2017/10/14 全球购物
公务员保密承诺书
2014/03/27 职场文书
铁路安全事故反思
2014/04/26 职场文书
企业管理标语
2014/06/10 职场文书
法定代表人证明书
2014/11/28 职场文书
2014年环保局工作总结
2014/12/11 职场文书