解决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注释详解
Jun 01 Python
python常用知识梳理(必看篇)
Mar 23 Python
python遍历一个目录,输出所有的文件名的实例
Apr 23 Python
一文带你了解Python中的字符串是什么
Nov 20 Python
Python Matplotlib库安装与基本作图示例
Jan 09 Python
在python中对变量判断是否为None的三种方法总结
Jan 23 Python
selenium+python自动化测试之鼠标和键盘事件
Jan 23 Python
对python3.4 字符串转16进制的实例详解
Jun 12 Python
Django-Scrapy生成后端json接口的方法示例
Oct 06 Python
python 利用jieba.analyse进行 关键词提取
Dec 17 Python
浅谈Python响应式类库RxPy
Jun 14 Python
PyTorch device与cuda.device用法
Apr 03 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
人工智能开始玩《星际争霸2》 你的操作跟得上吗?
2017/08/11 星际争霸
德生1994机评
2021/03/02 无线电
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
解析PHP的session过期设置
2013/06/29 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
2017/02/23 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
jquery简单实现网页层的展开与收缩效果
2015/08/07 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
2015/08/24 Javascript
js获取时间函数及扩展函数的方法
2016/10/30 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
jQuery实现动态显示select下拉列表数据的方法
2018/02/05 jQuery
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
在Create React App中使用CSS Modules的方法示例
2019/01/15 Javascript
vue集成chart.js的实现方法
2019/08/20 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
Python 如何访问外围作用域中的变量
2016/09/11 Python
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
python如何将图片转换为字符图片
2020/08/19 Python
python利用ffmpeg进行录制屏幕的方法
2019/01/10 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
基于pytorch 预训练的词向量用法详解
2020/01/06 Python
TensorFlow——Checkpoint为模型添加检查点的实例
2020/01/21 Python
构建高效的python requests长连接池详解
2020/05/02 Python
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
加拿大奢华时装品牌:Mackage
2018/01/10 全球购物
Java的类与C++的类有什么不同
2014/01/18 面试题
生产部经理岗位职责
2013/12/16 职场文书
仓库规划计划书
2014/04/28 职场文书
农村党支部承诺书
2015/04/30 职场文书
故意伤害辩护词
2015/05/21 职场文书
2015年领导班子工作总结
2015/05/23 职场文书
行政上诉状范文
2015/05/23 职场文书
小学生手册家长意见
2015/06/03 职场文书
自荐信大全
2019/03/21 职场文书
靠谱准确的求职信
2019/04/02 职场文书