使用Python实时获取cmd的输出
2017-12-19 17:33
603 查看
转自 :https://www.cnblogs.com/podolski/p/5040107.html
最近发现一个问题,一个小伙儿写的console程序不够健壮,监听SOCKET的时候容易崩,造成程序的整体奔溃,无奈他没有找到问题的解决办法,一直解决不了,可是这又是一个监控程序,还是比较要紧的,又必须想办法解决。
(这是要搞死我的节奏啊....)由于个人不太懂他用的语言,只能在程序外围想办法。
环境描述:
1. 目标程序执行时会监听8080端口,TCP,并在每一次client连接后通过console输出client的IP地址。
2. 监听不是一次性完成的,而是一直监听,程序并不会退出
3. 为了监控需要,最好能对连接的IP进行排序,整理。
P.S. 系统基于windows平台。
想起来做监控程序,简单点比较好,于是想到了Python。
我的预想逻辑是这样的,通过python检测目标程序是否崩了,如果中标就启动目标程序,并进行监控,每输出一次,python进行一次数据运算整理,然后循环。
我用netstat -a替代那个需要持续输出的程序,执行程序,发现程序和想象的不太一样,确实是实时获得数据了,但是感觉总是有点不太和谐,不管了,继续。
程序或者还是死的,有一点非常关键,就是监听端口,那只要检测一下端口就行了。三个办法:
1. 找端口检测的API
2. 连接一次目标端口,通了就是活的
3. netstat
第一种方法需要去找找有没有相关的API,第二种方法容易对目标程序的正常运行造成问题,第三种我想都没想就用了吧。这里需要用到cmd的重定向功能
netstat -an获得当前的端口监听情况,“|”将netstat的输出重定向到findstr函数
netstat -an | findstr "8080" 查找有8080端口的地址行,有就说明活着,否则就是挂了。
最近发现一个问题,一个小伙儿写的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端口的地址行,有就说明活着,否则就是挂了。
相关文章推荐
- Python实时获取cmd的输出
- Python实时获取cmd的输出
- python使用管道获取其它进程的输出内容
- C# Process执行cmd指令,实时获取输出并隐藏cmd窗口
- python 实时获取子进程输出
- python量化分析系列之---使用python获取股票历史数据和实时分笔数据
- Python:从subprocess运行的子进程中实时获取输出
- python量化分系列之---使用tushare获取股票实时分笔数据延时有多大
- python分别使用多线程和多进程获取所有股票实时数据
- python 获取subprocess实时输出信息
- Python获取命令实时输出-原样彩色输出并返回输出结果
- python量化分析系列之---python分别使用多线程和多进程获取所有股票实时数据
- [Python高效编程] - 获取天气信息并使用迭代for输出
- [Python]paramiko实时获取命令执行输出及sftp上传
- 使用python获取实时卫星云图
- python分别使用多线程和多进程获取所有股票实时数据
- 这个帖子要收藏,以后用得着--python 实时获取子进程输出
- PyQt5 实时获取屏幕界面图像,python3使用matplotlib
- 如何获取getevent的输出,并且记录到文件中?使用python操作
- 实时获取Python的print输出流