解决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实现的一个火车票转让信息采集器
Jul 09 Python
Python获取单个程序CPU使用情况趋势图
Mar 10 Python
python中的装饰器详解
Apr 13 Python
Python中获取对象信息的方法
Apr 27 Python
Python中几种属性访问的区别与用法详解
Oct 10 Python
python学习开发mock接口
Apr 28 Python
使用pip安装python库的多种方式
Jul 31 Python
Python3 A*寻路算法实现方式
Dec 24 Python
Python识别处理照片中的条形码
Nov 16 Python
PyTorch预训练Bert模型的示例
Nov 17 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
Jan 12 Python
如何用 Python 制作 GitHub 消息助手
Feb 20 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
php array_search() 函数使用
2010/04/13 PHP
PHP eval函数使用介绍
2013/12/08 PHP
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
PHP类的特性实例分析
2016/09/28 PHP
php格式文件打开的四种方法
2018/02/24 PHP
JSQL  一个 web DB 的封装
2010/05/05 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
JavaScript中的类(Class)详细介绍
2014/12/30 Javascript
jQuery实现的图片分组切换焦点图插件
2015/01/06 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
js获取鼠标位置实例详解
2015/12/09 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
原生js实现手风琴功能(支持横纵向调用)
2017/01/13 Javascript
electron实现静默打印的示例代码
2019/08/12 Javascript
微信小程序使用echarts获取数据并生成折线图
2019/10/16 Javascript
使用Vue实现简单计算器
2020/02/25 Javascript
使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
2014/04/15 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
6种非常炫酷的CSS3按钮边框动画特效
2016/03/16 HTML / CSS
日本小田急百货官网:Odakyu
2018/07/19 全球购物
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
优秀学生干部个人的自我评价
2013/10/04 职场文书
仓库管理员岗位职责
2014/03/19 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
学习教师敬业奉献模范事迹材料思想汇报
2014/09/19 职场文书
交通安全横幅标语
2014/10/07 职场文书
2014年学校体育工作总结
2014/12/08 职场文书
地道战观后感400字
2015/06/04 职场文书
六五普法心得体会2016
2016/01/21 职场文书
Python如何用re模块实现简易tokenizer
2022/05/02 Python
Spring JPA 增加字段执行异常问题及解决
2022/06/10 Java/Android
JavaScript设计模式之原型模式详情
2022/06/21 Javascript