解决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之print详解
Sep 28 Python
Python中的map()函数和reduce()函数的用法
Apr 27 Python
python下实现二叉堆以及堆排序的示例
Sep 29 Python
Python tornado队列示例-一个并发web爬虫代码分享
Jan 09 Python
对numpy Array [: ,] 的取值方法详解
Jul 02 Python
python 把列表转化为字符串的方法
Oct 23 Python
pandas.dataframe按行索引表达式选取方法
Oct 30 Python
Python中整数的缓存机制讲解
Feb 16 Python
Django如何自定义model创建数据库索引的顺序
Jun 20 Python
python如何求数组连续最大和的示例代码
Feb 04 Python
python设置中文界面实例方法
Oct 27 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
Nov 28 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
短波问题解答
2021/02/28 无线电
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
2011/12/28 PHP
Ping服务的php实现方法,让网站快速被收录
2012/02/04 PHP
JSQL SQLProxy 的 php 版本代码
2010/05/05 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
2013/11/08 Javascript
ListBox实现上移,下移,左移,右移的简单实例
2014/02/13 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
javascript 使用for循环时该注意的问题-附问题总结
2015/08/19 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
2016/08/23 Javascript
详解vue过滤器在v2.0版本用法
2017/06/01 Javascript
JS解决position:sticky的兼容性问题的方法
2017/10/17 Javascript
vue项目实现github在线预览功能
2018/06/20 Javascript
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
NodeJS 实现多语言的示例代码
2018/09/11 NodeJs
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
jQuery实现的解析本地 XML 文档操作示例
2020/04/30 jQuery
[03:30]DOTA2完美“圣”典精彩集锦
2016/12/27 DOTA
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
一些Python中的二维数组的操作方法
2015/05/02 Python
Python守护进程用法实例分析
2015/06/04 Python
在Python程序中操作MySQL的基本方法
2015/07/29 Python
python SQLAlchemy 中的Engine详解
2019/07/04 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
纯CSS实现预加载动画效果
2017/09/06 HTML / CSS
使用CSS3的背景渐变Text Gradient 创建文字颜色渐变
2014/08/19 HTML / CSS
Nike法国官方网站:Nike.com FR
2018/07/22 全球购物
法国房车租赁网站:Yescapa
2019/08/26 全球购物
连锁超市项目计划书
2014/09/15 职场文书
罚站检讨书
2015/01/29 职场文书
文案策划岗位职责
2015/02/11 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书
Pandas-DataFrame知识点汇总
2022/03/16 Python