解决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计算最小优先级队列代码分享
Dec 18 Python
总结Python编程中三条常用的技巧
May 11 Python
Python的Django框架中URLconf相关的一些技巧整理
Jul 18 Python
Python实现优先级队列结构的方法详解
Jun 02 Python
python常见排序算法基础教程
Apr 13 Python
python3.6连接MySQL和表的创建与删除实例代码
Dec 28 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
Python嵌套式数据结构实例浅析
Mar 05 Python
对tensorflow 中tile函数的使用详解
Feb 07 Python
基于pytorch padding=SAME的解决方式
Feb 18 Python
如何基于windows实现python定时爬虫
May 01 Python
使用OpenCV对车道进行实时检测的实现示例代码
Jun 19 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单例模式应用示例【多次连接数据库只实例化一次】
2018/12/18 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
解密效果
2006/06/23 Javascript
[原创]网络复制内容时常用的正则+editplus
2006/11/30 Javascript
extjs 的权限问题 要求控制的对象是 菜单,按钮,URL
2010/03/09 Javascript
在vs2010中调试javascript代码方法
2011/02/11 Javascript
多种方法判断Javascript对象是否存在
2013/09/22 Javascript
JS操作Cookie写入和读取实例代码
2013/10/20 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
2014/03/13 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
js实现遍历含有input的table实例
2015/12/07 Javascript
JavaScript中的原型prototype完全解析
2016/05/10 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
详解vue组件通信的三种方式
2017/06/30 Javascript
vue实现单选和多选功能
2017/08/11 Javascript
VUE重点问题总结
2018/03/19 Javascript
ng-alain表单使用方式详解
2018/07/10 Javascript
Vue实现省市区三级联动
2020/12/27 Vue.js
[02:53]DOTA2亚洲邀请赛 NewBee战队巡礼
2015/02/03 DOTA
Python 用Redis简单实现分布式爬虫的方法
2017/11/23 Python
对numpy中轴与维度的理解
2018/04/18 Python
关于python导入模块import与常见的模块详解
2019/08/28 Python
pytorch中的transforms模块实例详解
2019/12/31 Python
canvas绘制视频封面的方法
2018/02/05 HTML / CSS
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
nohup的用法
2014/08/10 面试题
大学生工作推荐信范文
2013/12/02 职场文书
计算机学生的自我评价分享
2014/02/18 职场文书
《歌唱二小放牛郎》教学反思
2014/04/19 职场文书
学校搬迁方案
2014/06/15 职场文书
创先争优宣传标语
2014/10/08 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
2014年教育培训工作总结
2014/12/08 职场文书
从事会计工作年限证明
2015/06/23 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书