亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python實(shí)時(shí)獲取cmd的輸出

 更新時(shí)間:2015年12月13日 15:38:10   作者:波多爾斯基  
本文給大家分享python實(shí)時(shí)獲取cmd的輸出,對(duì)python實(shí)時(shí)獲取輸出相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧

最近發(fā)現(xiàn)一個(gè)問題,一個(gè)小伙兒寫的console程序不夠健壯,監(jiān)聽SOCKET的時(shí)候容易崩,造成程序的整體奔潰,無奈他沒有找到問題的解決辦法,一直解決不了,可是這又是一個(gè)監(jiān)控程序,還是比較要緊的,又必須想辦法解決。

(這是要搞死我的節(jié)奏啊....)由于個(gè)人不太懂他用的語言,只能在程序外圍想辦法。

環(huán)境描述:

1. 目標(biāo)程序執(zhí)行時(shí)會(huì)監(jiān)聽8080端口,TCP,并在每一次client連接后通過console輸出client的IP地址。

2. 監(jiān)聽不是一次性完成的,而是一直監(jiān)聽,程序并不會(huì)退出

3. 為了監(jiān)控需要,最好能對(duì)連接的IP進(jìn)行排序,整理。

P.S. 系統(tǒng)基于windows平臺(tái)。

想起來做監(jiān)控程序,簡單點(diǎn)比較好,于是想到了Python。

我的預(yù)想邏輯是這樣的,通過python檢測目標(biāo)程序是否崩了,如果中標(biāo)就啟動(dòng)目標(biāo)程序,并進(jìn)行監(jiān)控,每輸出一次,python進(jìn)行一次數(shù)據(jù)運(yùn)算整理,然后循環(huán)。

第一步,先搞定輸出的捕獲問題。

# 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替代那個(gè)需要持續(xù)輸出的程序,執(zhí)行程序,發(fā)現(xiàn)程序和想象的不太一樣,確實(shí)是實(shí)時(shí)獲得數(shù)據(jù)了,但是感覺總是有點(diǎn)不太和諧,不管了,繼續(xù)。

第二步,解決監(jiān)控程序的問題

程序或者還是死的,有一點(diǎn)非常關(guān)鍵,就是監(jiān)聽端口,那只要檢測一下端口就行了。三個(gè)辦法:

1. 找端口檢測的API

2. 連接一次目標(biāo)端口,通了就是活的

3. netstat

第一種方法需要去找找有沒有相關(guān)的API,第二種方法容易對(duì)目標(biāo)程序的正常運(yùn)行造成問題,第三種我想都沒想就用了吧。這里需要用到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)     # 防止動(dòng)作過快,把新建的程序整死了
    time.sleep(3)
    subprocess.Popen('start node D:\\app.js', shell=True)
  time.sleep(10) 

netstat -an獲得當(dāng)前的端口監(jiān)聽情況,“|”將netstat的輸出重定向到findstr函數(shù)

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) 

然后發(fā)現(xiàn)有問題,程序完全不會(huì)定時(shí)檢測,只會(huì)卡在readline()上。

各種找問題,發(fā)現(xiàn)那個(gè)process.stdout.readline()是個(gè)同步方法,沒結(jié)果就不返回。有沒有的能異步的方法? 

有人用fnctl,windows不支持,pass

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

折騰了半天,最后關(guān)頭我還是用c#解決這個(gè)問題了....

參考代碼見http://www.jiamaocode.com/Cts/1031.html,打不開的話http://www.cnblogs.com/sode/archive/2012/07/10/2583941.html有轉(zhuǎn)載

總算解決了這個(gè)問題,但是我心中還是不爽,思考了很久如何解決異步readline()的問題。忽然想起來多線程這個(gè)利器,干脆開

一個(gè)線程,不返回就等著,不就問題解決了。

# 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() 

總結(jié)

有時(shí)候簡單的解決方法也可以實(shí)現(xiàn)同樣的功能,對(duì)比python的實(shí)現(xiàn)與C#的實(shí)現(xiàn),C#更面向事件一點(diǎn),python應(yīng)該也有不錯(cuò)的解決方案,繼續(xù)摸索...

以上內(nèi)容是小編給大家分享的Python實(shí)時(shí)獲取cmd的輸出的相關(guān)知識(shí),希望大家喜歡。

相關(guān)文章

  • Python獲取linux主機(jī)ip的簡單實(shí)現(xiàn)方法

    Python獲取linux主機(jī)ip的簡單實(shí)現(xiàn)方法

    這篇文章主要介紹了Python獲取linux主機(jī)ip的簡單實(shí)現(xiàn)方法,涉及Python使用socket模塊調(diào)用shell命令的相關(guān)技巧,需要的朋友可以參考下
    2016-04-04
  • 分享8個(gè)非常流行的 Python 可視化工具包

    分享8個(gè)非常流行的 Python 可視化工具包

    喜歡用 Python 做項(xiàng)目的小伙伴不免會(huì)遇到這種情況:做圖表時(shí),用哪種好看又實(shí)用的可視化工具包呢?今天小編給大家分享8個(gè)非常流行的 Python 可視化工具包,需要的朋友可以參考下
    2019-06-06
  • Python 類的私有屬性和私有方法實(shí)例分析

    Python 類的私有屬性和私有方法實(shí)例分析

    這篇文章主要介紹了Python 類的私有屬性和私有方法,結(jié)合實(shí)例形式分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中類的私有屬性與私有方法簡單操作技巧,需要的朋友可以參考下
    2019-09-09
  • 基于Python實(shí)現(xiàn)在線二維碼生成工具

    基于Python實(shí)現(xiàn)在線二維碼生成工具

    這篇文章將為大家展示如何通過純Python編程的方式,開發(fā)出一個(gè)網(wǎng)頁應(yīng)用—基于輸入的網(wǎng)址等文字內(nèi)容實(shí)現(xiàn)二維碼的生成,感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • python之PyAutoGui教你做個(gè)自動(dòng)腳本計(jì)算器的方法

    python之PyAutoGui教你做個(gè)自動(dòng)腳本計(jì)算器的方法

    這篇文章主要介紹了python之PyAutoGui教你做個(gè)自動(dòng)腳本計(jì)算器的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • python kmeans聚類簡單介紹和實(shí)現(xiàn)代碼

    python kmeans聚類簡單介紹和實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了python kmeans聚類簡單介紹和實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • plotly分割顯示mnist的方法詳解

    plotly分割顯示mnist的方法詳解

    這篇文章主要為大家詳細(xì)介紹了plotly分割顯示mnist的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • pandas去重復(fù)行并分類匯總的實(shí)現(xiàn)方法

    pandas去重復(fù)行并分類匯總的實(shí)現(xiàn)方法

    這篇文章主要介紹了pandas去重復(fù)行并分類匯總的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Python實(shí)現(xiàn)抓取騰訊視頻所有電影的示例代碼

    Python實(shí)現(xiàn)抓取騰訊視頻所有電影的示例代碼

    這篇文章主要為大家介紹了如何使用python實(shí)現(xiàn)抓取騰訊視頻所有電影,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • yolov5中train.py代碼注釋詳解與使用教程

    yolov5中train.py代碼注釋詳解與使用教程

    train.py里面加了很多額外的功能,使得整體看起來比較復(fù)雜,其實(shí)核心部分主要就是 讀取數(shù)據(jù)集,加載模型,訓(xùn)練中損失的計(jì)算,下面這篇文章主要給大家介紹了關(guān)于yolov5中train.py代碼注釋詳解與使用的相關(guān)資料,需要的朋友可以參考下
    2022-09-09

最新評(píng)論