最近发现一个问题,一个小伙儿写的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的输出的相关知识,希望大家喜欢。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 魔兽世界wlk暗牧一键输出宏是什么 wlk暗牧一键输出宏介绍
- 群星.1996-红不让台语原唱2辑【福和唱片】【WAV+CUE】
- 郭书瑶.2009-爱的抱抱(EP)【种子音乐】【FLAC分轨】
- 郑瑞芬.1989-BE.MY.BABY【现代】【WAV+CUE】
- 花钱请人每周放30万只不咬人的蚊子 防治登革热传播
- 饭制《第一后裔》丧尸版弗蕾娜
- 贝克汉姆亲临!2024FC品类游戏嘉年华圆满落幕
- 「命轨爻错之翼」风之翼发放说明
- 《原神》前瞻特别节目回顾长图
- 米游币抽抽乐-原神专场现已开启!
- 黑鸭子2001《风情中国HQCD》[日本版][WAV+CUE]
- 陈杰洲1990-成人礼[滚石][WAV+CUE]
- MarkAanderud-HandsFree(2024)[24-44,1]FLAC
- 孙露《观心》1:1母盘直刻限量版[低速原抓WAV+CUE][361M]
- 钟志刚《汽车DJ玩主》[低速原抓WAV+CUE][1G]