解决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标准算法实现数组全排列的方法
Mar 17 Python
python插入数据到列表的方法
Apr 30 Python
django批量导入xml数据
Oct 16 Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
May 25 Python
node.js获取参数的常用方法(总结)
May 29 Python
Python实现图片滑动式验证识别方法
Nov 09 Python
python判断字符串或者集合是否为空的实例
Jan 23 Python
python自定义函数实现最大值的输出方法
Jul 09 Python
keras .h5转移动端的.tflite文件实现方式
May 25 Python
Python classmethod装饰器原理及用法解析
Oct 17 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
Nov 02 Python
python lambda 表达式形式分析
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
十大感人催泪爱情动漫 第一名至今不忍在看第二遍
2020/03/04 日漫
Php获取金书网的书名的实现代码
2010/06/11 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
2011/10/31 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
JavaScript常用全局属性与方法记录积累
2013/07/03 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
jQuery解决input超多的表单提交
2015/08/10 Javascript
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
快速学习jQuery插件 Cookie插件使用方法
2015/12/01 Javascript
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
最棒的Angular2表格控件
2016/08/10 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
Angular中管道操作符(|)的使用方法
2017/12/15 Javascript
关于jquery中attr()和prop()方法的区别
2018/05/28 jQuery
vue中如何实现pdf文件预览的方法
2018/07/12 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
2018/12/12 Javascript
Vue项目打包部署到iis服务器的配置方法
2019/10/14 Javascript
Nest.js 授权验证的方法示例
2021/02/22 Javascript
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python 制作糗事百科爬虫实例
2016/09/22 Python
python中的常量和变量代码详解
2018/07/25 Python
python opencv minAreaRect 生成最小外接矩形的方法
2019/07/01 Python
深入了解Django中间件及其方法
2019/07/26 Python
python开头的coding设置方法
2019/08/08 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
python生成xml时规定dtd实例方法
2020/09/21 Python
利用python进行文件操作
2020/12/04 Python
Desigual英国官网:在线购买原创服装
2018/03/09 全球购物
WWE美国职业摔角官方商店:WWE Shop
2018/11/15 全球购物
环境科学专业个人求职信
2013/09/26 职场文书
2015年幼儿园教研活动总结
2015/03/25 职场文书
Golang并发操作中常见的读写锁详析
2021/08/30 Golang
JavaScript的Set数据结构详解
2022/02/18 Javascript