python执行命令、该命令执行时间长_解决paramiko执行命令超时的问题-程序员宅基地

技术标签: 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博客。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39990558/article/details/110564923

智能推荐

Qss语法及应用4_qtoolbox样式-程序员宅基地

文章浏览阅读1.8k次。此为系列文章,需要全部文档内容及样例素材,请点击打开链接https://download.csdn.net/download/guoyanbo_81/104326159常用控件样式表9.1QAbstractScrollArea所有继承于QAbstractScrollArea类的子类窗口,包括QtextEdit、QAbstractItemView支持使用background-attachment滚动..._qtoolbox样式

Android技术栈_oms wms tms技术栈-程序员宅基地

文章浏览阅读411次。Android技术栈汇总自查安卓2018面试技术栈ams(AndroidManagerService) wms(WindowManagerService) pms(PackageManagerService)源码分析,(ps:面试官会问Manifest里面的东西怎么加载的,或者问你Activity怎么加载的,你得说出这些来。) Rxjava的原理,主要是背压能说说 自定义绘制控件,..._oms wms tms技术栈

hive序列生成_Hive实现自增列的两种方法-程序员宅基地

文章浏览阅读3.9k次。多维数据仓库中的维度表和事实表一般都需要有一个代理键,作为这些表的主键,代理键一般由单列的自增数字序列构成。Hive没有关系数据库中的自增列,但它也有一些对自增序列的支持,通常有两种方法生成代理键:使用row_number()窗口函数或者使用一个名为UDFRowSequence的用户自定义函数(UDF)。用row_number()函数生成代理键INSERT OVERWRITE TABLEmy_hi..._hive 生成序列

qml 音乐播放器_qt qml 音频播放-程序员宅基地

文章浏览阅读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 音频播放

npm install经常失败解决办法_npm install qrcodejs-weapp 安装不上-程序员宅基地

文章浏览阅读2.3w次,点赞4次,收藏11次。npm install经常失败解决方法 由于npm包管理服务器在米国,故我们如果直接使用npm -install安装某包,有些时候会出现安装失败(原因你懂的)。所以,为了更好的使用体验采用了淘宝的 NPM 镜像,它是一个完整的npmjs.org镜像。 1.通过定制的 cnpm 命令行工具代替默认的 npm npm install -g cnpm --registr_npm install qrcodejs-weapp 安装不上

662页PYTORCH 官方教程最新中文版(1.11+CU10.2)_pytorch中文文档pdf-程序员宅基地

文章浏览阅读1.5k次。pytorch1.11官方教程中文版_pytorch中文文档pdf

随便推点

js_02 windows对象及函数_js 如何自定义window方法-程序员宅基地

文章浏览阅读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方法

python循环删除_python 循环删除不死马php-程序员宅基地

文章浏览阅读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

强大工具psexec工具用法简介-程序员宅基地

文章浏览阅读789次。psexec是sysinternals的一款强大的软件,通过他可以提权和执行远程命令,对于批量大范围的远程运维能起到很好的效果,尤其是在域环境下。通常,这个命令,常用的有如下2种方式。l 以系统身份运行指定应用程序这个很简单,但是很有意思,Windows系统中administrator的权限不是最大的,最大的是system,很多信息只有system才能查看,比如注册表的sam信息,administrator是看不了的,如果你非要强行修改sam的权限而不顾安全的话,拿就是另外一种情况。那么现在我们要以s

Flink UI: Flink 1.10 如何查看 数据源 的背压(反压)情况(消费kafka)_flink如何查看背压-程序员宅基地

文章浏览阅读3k次。1.美图2. 概述想对一个flink程序进行性能测试,因此你需要知道flink消费程序的上限,因此,怎么知道你flink程序有没有达到上限呢?在界面上就能看到,比如我kafka写入的速度是 每秒4万条数据写入到kafka。在界面上找到你的数据源,然后点击,这个界面需要等待一会才有数据如果出现上述情况,那么说明已经达到flink消费的最大速度了。背压很高..._flink如何查看背压

Android使用https链接_file:///android_asset/cac/warning.html-程序员宅基地

文章浏览阅读8.8w次。Https与Http类似,只不过Https一般是通过post请求服务器,但是Https与http不同的是Https与服务器会话是处于连接状态。http则发送请求后连接就会断开。另外使用HttpsURLConnection时需要实现HostnameVerifier 和 X509TrustManager,这两个实现是必须的,要不会报安全验证异常。package cn.yws.httpstest_file:///android_asset/cac/warning.html

docker 在push镜像到本地registry出现的500 Internal Server Error_retrying in 1 second-程序员宅基地

文章浏览阅读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

推荐文章

热门文章

相关标签