解决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计算三角函数之acos()方法的使用
May 15 Python
python 容器总结整理
Apr 04 Python
python 中random模块的常用方法总结
Jul 08 Python
python正则表达式面试题解答
Apr 28 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
Apr 04 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
Jun 14 Python
Python中栈、队列与优先级队列的实现方法
Jun 30 Python
python实现beta分布概率密度函数的方法
Jul 08 Python
详解Python利用random生成一个列表内的随机数
Aug 21 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
Jun 15 Python
提高python代码运行效率的一些建议
Sep 29 Python
Pycharm中使用git进行合作开发的教程详解
Nov 17 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函数
2006/10/09 PHP
通过curl模拟post和get方式提交的表单类
2014/04/23 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
2015/09/20 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
2016/03/17 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
fckeditor 获取文本框值的实现代码
2009/02/09 Javascript
Jquery取得iframe下内容的方法
2013/11/18 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
Jquery性能优化详解
2014/05/15 Javascript
jquery结婚电子请柬特效源码分享
2015/08/21 Javascript
jQuery toggle 代替方法
2016/03/22 Javascript
javascript基本数据类型和转换
2017/03/17 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
微信小程序日历组件使用方法详解
2018/12/29 Javascript
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
[06:45]DOTA2-DPC中国联赛 正赛 Magma vs LBZS 选手采访
2021/03/11 DOTA
Python生成随机验证码的两种方法
2015/12/22 Python
python爬取m3u8连接的视频
2018/02/28 Python
python实现websocket的客户端压力测试
2019/06/25 Python
python selenium 查找隐藏元素 自动播放视频功能
2019/07/24 Python
python线程中的同步问题及解决方法
2019/08/29 Python
python通过对字典的排序,对json字段进行排序的实例
2020/02/27 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
2020/09/16 Python
分享unittest单元测试框架中几种常用的用例加载方法
2020/12/02 Python
在Python中实现字典反转案例
2020/12/05 Python
大学生求职简历的自我评价
2013/10/21 职场文书
会计电算化个人求职信范文
2014/01/24 职场文书
简爱读书笔记
2015/06/26 职场文书
婚礼双方父亲致辞
2015/07/27 职场文书
《珍珠鸟》教学反思
2016/02/16 职场文书
2019年二手房买卖合同范本
2019/10/14 职场文书
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL
基于Python实现股票收益率分析
2022/04/02 Python
2022年显卡天梯图(6月更新)
2022/06/17 数码科技