广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python实时获取cmd的输出
  • 330
分享到

Python实时获取cmd的输出

实时Pythoncmd 2022-06-04 19:06:02 330人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

最近发现一个问题,一个小伙儿写的console程序不够健壮,监听Socket的时候容易崩,造成程序的整体奔溃,无奈他没有找到问题的解决办法,一直解决不了,可是这又是一个监控程序,还是比较要紧的,又必须想办法

最近发现一个问题,一个小伙儿写的console程序不够健壮,监听Socket的时候容易崩,造成程序的整体奔溃,无奈他没有找到问题的解决办法,一直解决不了,可是这又是一个监控程序,还是比较要紧的,又必须想办法解决。

(这是要搞死我的节奏啊....)由于个人不太懂他用的语言,只能在程序外围想办法。

环境描述:

1. 目标程序执行时会监听8080端口,tcp,并在每一次client连接后通过console输出client的IP地址。

2. 监听不是一次性完成的,而是一直监听,程序并不会退出

3. 为了监控需要,最好能对连接的IP进行排序,整理。

P.S. 系统基于windows平台。

想起来做监控程序,简单点比较好,于是想到了python

我的预想逻辑是这样的,通过Python检测目标程序是否崩了,如果中标就启动目标程序,并进行监控,每输出一次,python进行一次数据运算整理,然后循环。

第一步,先搞定输出的捕获问题。


# this method is used for monitoring
import time
import subprocess
import locale
import codecs
mylist = []
ps = subprocess.Popen('netstat -a', stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
while True:
  data = ps.stdout.readline()
  if data == b'':
    if ps.poll() is not None:
      break
  else:
    mylist.append(data.decode(codecs.lookup(locale.getpreferredencoding()).name))
    newlist = []
    for i in mylist:
      if i.find('192.168') > 0:
        newlist.append(i)
    newlist.sort()
    print('Sum of requests from LAN:', len(newlist)) 

我用netstat -a替代那个需要持续输出的程序,执行程序,发现程序和想象的不太一样,确实是实时获得数据了,但是感觉总是有点不太和谐,不管了,继续。

第二步,解决监控程序的问题

程序或者还是死的,有一点非常关键,就是监听端口,那只要检测一下端口就行了。三个办法:

1. 找端口检测的api

2. 连接一次目标端口,通了就是活的

3. netstat

第一种方法需要去找找有没有相关的API,第二种方法容易对目标程序的正常运行造成问题,第三种我想都没想就用了吧。这里需要用到cmd的重定向功能


# this method is used for monitoring
import time
import subprocess
import locale
import codecs
def getstdout(p):
  mylist = []
  while True:
    data = p.stdout.readline()
    if data == b'':
      if p.poll() is not None:
        break
    else:
      mylist.append(data.decode(codecs.lookup(locale.getpreferredencoding()).name))
  return mylist
while True:
  ps = subprocess.Popen('netstat -an | findstr "8080"', stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
  resultlist = getstdout(ps)
  if len(resultlist) >= 1:
    pass
  else:
    print(time.strftime("%Y-%m-%d %H:%M:%S"))
    subprocess.Popen('taskkill.exe /f /im node.exe', shell=False)     # 防止动作过快,把新建的程序整死了
    time.sleep(3)
    subprocess.Popen('start node D:\app.js', shell=True)
  time.sleep(10) 

netstat -an获得当前的端口监听情况,“|”将netstat的输出重定向到findstr函数

netstat -an | findstr "8080" 查找有8080端口的地址行,有就说明活着,否则就是挂了。

最后一步,整合


# this method is used for monitoring
import time
import subprocess
import locale
import codecs
def getstdout(p):
  mylist = []
  while True:
    data = p.stdout.readline()
    if data == b'':
      if p.poll() is not None:
        break
    else:
      mylist.append(data.decode(codecs.lookup(locale.getpreferredencoding()).name))
  return mylist
while True:
  ps = subprocess.Popen('netstat -an | findstr "8080"', stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
  resultlist = getstdout(ps)
  if len(resultlist) >= 1:
    pass
  else:
    print(time.strftime("%Y-%m-%d %H:%M:%S"))
    subprocess.Popen('taskkill.exe /f /im node.exe', shell=False)
    time.sleep(3)
    pss = subprocess.Popen('start cmd.exe /k node app.js', stdin=subprocess.PIPE,
                stdout=subprocess.PIPE, shell=True)
    alist = getstdout(pss)
    newlist = []
    for i in alist:
      if i.find('192.168') > 0:
        newlist.append(i)
    newlist.sort()
    print('Sum of requests from LAN:', len(newlist))
  time.sleep(10) 

然后发现有问题,程序完全不会定时检测,只会卡在readline()上。

各种找问题,发现那个process.stdout.readline()是个同步方法,没结果就不返回。有没有的能异步的方法?

有人用fnctl,windows不支持,pass

asyncio?看了半天没太明白...

折腾了半天,最后关头我还是用C#解决这个问题了....

参考代码见Http://www.jiamaocode.com/Cts/1031.html,打不开的话http://www.cnblogs.com/sode/arcHive/2012/07/10/2583941.html有转载

总算解决了这个问题,但是我心中还是不爽,思考了很久如何解决异步readline()的问题。忽然想起来多线程这个利器,干脆开

一个线程,不返回就等着,不就问题解决了。


# this method is used for monitoring
import time
import subprocess
import locale
import codecs
import threading
alist = []
def getstdout(p, asy):
  if asy:
    alist.clear()
  mylist = []
  while True:
    data = p.stdout.readline()
    if data == b'':
      if p.poll() is not None:
        break
    else:
      if asy:
        alist.append(data.decode(codecs.lookup(locale.getpreferredencoding()).name))
      else:
        mylist.append(data.decode(codecs.lookup(locale.getpreferredencoding()).name))
  return mylist
while True:
  ps = subprocess.Popen('netstat -an | findstr ""', stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
  resultlist = getstdout(ps, False)
  if len(resultlist) >= :
    newlist = []
    for i in alist:
      if i.find('.') > :
        newlist.append(i)
    newlist.sort()
    print('Sum of requests from LAN:', len(newlist))
  else:
    print(time.strftime("%Y-%m-%d %H:%M:%S"))
    subprocess.Popen('taskkill.exe /f /im node.exe', shell=False)
    time.sleep()
    pss = subprocess.Popen('start cmd.exe /k node app.js', stdin=subprocess.PIPE,
                stdout=subprocess.PIPE, shell=True)
    th = threading.Thread(target=getstdout, args=[pss, True])
    th.start()
  time.sleep() 

总结

有时候简单的解决方法也可以实现同样的功能,对比python的实现与C#的实现,C#更面向事件一点,python应该也有不错的解决方案,继续摸索...

以上内容是小编给大家分享的Python实时获取cmd的输出的相关知识,希望大家喜欢。

--结束END--

本文标题: Python实时获取cmd的输出

本文链接: https://www.lsjlt.com/news/15624.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python实时获取cmd的输出
    最近发现一个问题,一个小伙儿写的console程序不够健壮,监听SOCKET的时候容易崩,造成程序的整体奔溃,无奈他没有找到问题的解决办法,一直解决不了,可是这又是一个监控程序,还是比较要紧的,又必须想办法...
    99+
    2022-06-04
    实时 Python cmd
  • 实时获取Python的print输出流
    我的应用场景是:使用shell执行python文件,并且通过调用的返回值获取python的标准输出流。 shell程序如下: cmd='python '$1' '$2' '$3' '$5' '$4 RESULT=eval $cm...
    99+
    2023-01-31
    实时 Python print
  • Python 获取命令行输出
    使用的是windows系统,python 2.7。 import os command = 'ping www.baidu.com ' #可以直接在命令行中执行的命令 r = os.popen(command) #执行该命...
    99+
    2023-01-31
    命令 行输出 Python
  • python获取命令行输出结果
    python获取命令行输出结果,并对结果进行过滤找到自己需要的! 这里以获取本机MAC地址和IP地址为例! # coding: GB2312 import os, re # execute command, and re...
    99+
    2023-01-31
    命令 行输出 python
  • python怎么获取控制台输出内容
    在Python中,可以使用print()函数将内容输出到控制台。如果想获取控制台输出的内容,可以使用subprocess模块来实现。...
    99+
    2023-10-18
    python
  • python 调用top命令获取输出信息
    问题:如何在linux上通过python脚本获取命令行的显示结果来进行处理? 解决方法: 1. python2.7版本有commands包 2. python3.x版本使用subprocess 下面是使用python3.4版本...
    99+
    2023-01-31
    命令 信息 python
  • cmd下如何获取当前系统时间的bat
    这篇文章主要介绍cmd下如何获取当前系统时间的bat,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!如何获取日期呢格式: %date%注:cmd中测试需要用echo %date%,bat中直接使用即可结果: 2020/...
    99+
    2023-06-08
  • python 获取网卡实时流量
    使用python监控系统时,获取网卡流量是比较难搞的,网上找了一个比较好的脚本,分享一下!psutil模块是一个跨平台的获取进程和系统应用情况(CPU,内存,磁盘,网络,传感器)的库。该模块用于系统监控、限制进程资源和运行进程的管理等方面安...
    99+
    2023-01-30
    网卡 实时 流量
  • shell 脚本中获取命令的输出的实现示例
    这个主要介绍的方法是获取命令的输出内容,而不是命令执行成功与否的返回值。 通常情况下,在shell脚本中需要获取命令的输出内容,然后根据输出内容判断下一步的执行操作。 比较常用的一种方式就是, 匹配命令输出的内容中是否存...
    99+
    2022-06-05
    shell 获取命令输出 shell命令输出
  • shell脚本中获取命令的输出的实现示例
    这个主要介绍的方法是获取命令的输出内容,而不是命令执行成功与否的返回值。 通常情况下,在shell脚本中需要获取命令的输出内容,然后根据输出内容判断下一步的执行操作。 比较常用的一种...
    99+
    2022-11-13
  • python 捕获shell脚本的输出结果实例
    import subprocess output =Popen(["mycmd","myarg"], stdout=PIPE).communicate()[0] import subprocess p =...
    99+
    2022-06-04
    脚本 实例 python
  • Python 通过subprocess运行代码,并实时获得该代码的窗口输出(如print输出、神经网络模型训练和推理相关实时输出等)
    目录 1. 需求2. 不考虑缓存情况下的实现2.1. 子进程测试代码2.2. 主进程代码 3. 考虑缓存情况下的实现 1. 需求 python主进程唤起一个py...
    99+
    2023-09-08
    python 开发语言
  • AJAX怎么获取服务器当前时间及时间格式输出处理
    这篇文章主要讲解了“AJAX怎么获取服务器当前时间及时间格式输出处理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“AJAX怎么获取服务器当前时间及时间格式输...
    99+
    2022-10-19
  • shell脚本中如何获取命令的输出
    这篇“shell脚本中如何获取命令的输出”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“shell脚本中如何获取命令的输出”文...
    99+
    2023-06-29
  • python 捕获 shell/bash 脚本的输出结果实例
    #!/usr/bin/python ## get subprocess module import subprocess ## call date command ## p = subprocess....
    99+
    2022-06-04
    脚本 实例 python
  • python获取指定时间差的时间实例详解
    python获取指定时间差的时间实例详解 在分析数据的时间经常需要截取一定范围时间的数据,比如三天之内,两小时前等等时间要求的数据,因此将该部分经常需要用到的功能模块化,方便以后以后用到的时候复用。在此,也...
    99+
    2022-06-04
    时间差 详解 实例
  • python简单实现获取当前时间
    说起计算机中的时间,还有一些比较有意思的事,比如我们经常听到的Unix时间戳,UTC时间,格林威治时间等,从表示上来讲他们基本属于同一个东西,因为他们的时间表示都是从1970年.1月.1日开始到现在的秒数,...
    99+
    2022-06-04
    简单 时间 python
  • Python实现获取视频时长功能
    目录前言环境依赖代码验证一下补充前言 本文提供获取视频时长的python代码,精确到毫秒,一如既往的实用主义。 环境依赖  ffmpeg环境安装,可以参考:windows ffmpe...
    99+
    2022-11-12
  • 分享Pytorch获取中间层输出的3种方法
    目录【1】方法一:获取nn.Sequential的中间层输出【2】方法二:IntermediateLayerGetter【3】方法三:钩子【1】方法一:获取nn.Sequential...
    99+
    2022-11-13
  • python获取服务器端的时间
    import httplib import time import os def get_webservertime(host): try: conn=httplib.HTTPConnection(host) ...
    99+
    2023-01-31
    服务器端 时间 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作