技术标签: python执行命令、该命令执行时间长
问题: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博客。
文章浏览阅读1.8k次。此为系列文章,需要全部文档内容及样例素材,请点击打开链接https://download.csdn.net/download/guoyanbo_81/104326159常用控件样式表9.1QAbstractScrollArea所有继承于QAbstractScrollArea类的子类窗口,包括QtextEdit、QAbstractItemView支持使用background-attachment滚动..._qtoolbox样式
文章浏览阅读411次。Android技术栈汇总自查安卓2018面试技术栈ams(AndroidManagerService) wms(WindowManagerService) pms(PackageManagerService)源码分析,(ps:面试官会问Manifest里面的东西怎么加载的,或者问你Activity怎么加载的,你得说出这些来。) Rxjava的原理,主要是背压能说说 自定义绘制控件,..._oms wms tms技术栈
文章浏览阅读3.9k次。多维数据仓库中的维度表和事实表一般都需要有一个代理键,作为这些表的主键,代理键一般由单列的自增数字序列构成。Hive没有关系数据库中的自增列,但它也有一些对自增序列的支持,通常有两种方法生成代理键:使用row_number()窗口函数或者使用一个名为UDFRowSequence的用户自定义函数(UDF)。用row_number()函数生成代理键INSERT OVERWRITE TABLEmy_hi..._hive 生成序列
文章浏览阅读992次,点赞2次,收藏5次。最近学习了qml的QtMultimedia,看了一个音乐播放器的例子,非常简单。主要就是播放器的模块比较重要,因为它可以获得播放的时长那个,进度,等等,然后用按钮添加播放器模块的事件,用text文本框来显示播放的进度以及状态。import QtQuick 2.5import QtMultimedia 5.0import QtQuick.Window 2.0import QtQuick.Layouts 1.0import QtQuick.Controls 2.0Window{ visibl_qt qml 音频播放
文章浏览阅读2.3w次,点赞4次,收藏11次。npm install经常失败解决方法 由于npm包管理服务器在米国,故我们如果直接使用npm -install安装某包,有些时候会出现安装失败(原因你懂的)。所以,为了更好的使用体验采用了淘宝的 NPM 镜像,它是一个完整的npmjs.org镜像。 1.通过定制的 cnpm 命令行工具代替默认的 npm npm install -g cnpm --registr_npm install qrcodejs-weapp 安装不上
文章浏览阅读1.5k次。pytorch1.11官方教程中文版_pytorch中文文档pdf
文章浏览阅读1.2k次。文章目录1.函数2.函数的分类2.1 系统函数2.2 自定义函数3.windows 对象3.1常用属性3.2常用方法3.3常用事件4.Date 对象4.1Date对象的方法4.2Data对象的使用1.函数函数的含义:类似于Java中的方法,是完成特定任务的代码语句块使用更简单:不用定义属于某个类,直接使用2.函数的分类2.1 系统函数parseInt (“字符串”)将字符串转换为整型数字如: parseInt (“86”)将字符串“86”转换为整型值86parseFloat(“字符串_js 如何自定义window方法
文章浏览阅读178次。想要python循环删除不出问题 ,倒序删除即可正序删除x = [1, 2, 3, 4]for i in x: if i == 2 or i == 3: x.remove(i)print x执行结果倒序删除x = [1, 2, 3, 4]for i in x[::-1]: if i == 2 or i == 3: x.remove(i)print x执行结果至于原因python中循环删除列表中元素时的坑!这篇文章里面写的很清_python 循环删除不死马php
文章浏览阅读789次。psexec是sysinternals的一款强大的软件,通过他可以提权和执行远程命令,对于批量大范围的远程运维能起到很好的效果,尤其是在域环境下。通常,这个命令,常用的有如下2种方式。l 以系统身份运行指定应用程序这个很简单,但是很有意思,Windows系统中administrator的权限不是最大的,最大的是system,很多信息只有system才能查看,比如注册表的sam信息,administrator是看不了的,如果你非要强行修改sam的权限而不顾安全的话,拿就是另外一种情况。那么现在我们要以s
文章浏览阅读3k次。1.美图2. 概述想对一个flink程序进行性能测试,因此你需要知道flink消费程序的上限,因此,怎么知道你flink程序有没有达到上限呢?在界面上就能看到,比如我kafka写入的速度是 每秒4万条数据写入到kafka。在界面上找到你的数据源,然后点击,这个界面需要等待一会才有数据如果出现上述情况,那么说明已经达到flink消费的最大速度了。背压很高..._flink如何查看背压
文章浏览阅读8.8w次。Https与Http类似,只不过Https一般是通过post请求服务器,但是Https与http不同的是Https与服务器会话是处于连接状态。http则发送请求后连接就会断开。另外使用HttpsURLConnection时需要实现HostnameVerifier 和 X509TrustManager,这两个实现是必须的,要不会报安全验证异常。package cn.yws.httpstest_file:///android_asset/cac/warning.html
文章浏览阅读1.6w次。在push镜像到本地registry时,出现以下错误:]# docker push 192.168.163.131:5000/testThe push refers to a repository [192.168.163.131:5000/test]9ec45e5f0334: Retrying in 1 second 33f1a94ed7fc: Retrying in 1 second_retrying in 1 second