解决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字典的方法详解
Aug 31 Python
Python 实现一行输入多个值的方法
Apr 21 Python
解决python删除文件的权限错误问题
Apr 24 Python
Python实现将数据写入netCDF4中的方法示例
Aug 30 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
Feb 18 Python
python批量将excel内容进行翻译写入功能
Oct 10 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
Mar 06 Python
pandas数据处理之绘图的实现
Jun 15 Python
Python如何定义有可选参数的元类
Jul 31 Python
python基于pygame实现飞机大作战小游戏
Nov 19 Python
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
Mar 03 Python
使用Python开发贪吃蛇游戏 SnakeGame
Apr 30 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
我的论坛源代码(九)
2006/10/09 PHP
php 引用(&)详解
2009/11/20 PHP
getimagesize获取图片尺寸实例
2014/11/15 PHP
PHP用反撇号执行外部命令
2015/04/14 PHP
php关闭warning问题的解决方法
2016/05/17 PHP
PHP7 新特性详细介绍
2016/09/06 PHP
php 自定义错误日志实例详解
2016/11/12 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
JS URL传中文参数引发的乱码问题
2009/09/02 Javascript
Jquery显示和隐藏元素或设为只读(含Ligerui的控件禁用,实例说明介绍)
2013/07/09 Javascript
7个JS基础知识总结
2014/03/05 Javascript
使用jquery操作session方法分享
2015/01/22 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
简单理解js的prototype属性及使用
2016/12/07 Javascript
JS中mouseup事件丢失的原因与解决办法
2017/06/14 Javascript
JS中验证整数和小数的正则表达式
2018/10/08 Javascript
js实现轮播图特效
2020/05/28 Javascript
python实现用户答题功能
2018/01/17 Python
python语言中with as的用法使用详解
2018/02/23 Python
在Python中调用Ping命令,批量IP的方法
2019/01/26 Python
Python接口自动化判断元素原理解析
2020/02/24 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
怎么解决pycharm license Acti的方法
2020/10/28 Python
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
德国骆驼商店:ActiveFashionWorld
2017/11/18 全球购物
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
类的核心特性有哪些
2014/01/01 面试题
摄影实习自我鉴定
2013/09/20 职场文书
最新的大学生找工作自我评价
2013/09/29 职场文书
先进个人事迹材料
2014/01/25 职场文书
德语专业求职信
2014/03/12 职场文书
主持人开场白台词
2015/05/29 职场文书
导游词之江南周庄
2019/12/06 职场文书
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技