最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實時獲取cmd的輸出

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

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

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

環(huán)境描述:

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

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

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

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

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

我的預想邏輯是這樣的,通過python檢測目標程序是否崩了,如果中標就啟動目標程序,并進行監(jiān)控,每輸出一次,python進行一次數(shù)據(jù)運算整理,然后循環(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替代那個需要持續(xù)輸出的程序,執(zhí)行程序,發(fā)現(xiàn)程序和想象的不太一樣,確實是實時獲得數(shù)據(jù)了,但是感覺總是有點不太和諧,不管了,繼續(xù)。

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

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

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獲得當前的端口監(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)有問題,程序完全不會定時檢測,只會卡在readline()上。

各種找問題,發(fā)現(xiàn)那個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() 

總結

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

以上內容是小編給大家分享的Python實時獲取cmd的輸出的相關知識,希望大家喜歡。

相關文章

  • 深入理解python中的atexit模塊

    深入理解python中的atexit模塊

    atexit模塊很簡單,只定義了一個register函數(shù)用于注冊程序退出時的回調函數(shù),我們可以在這個回調函數(shù)中做一些資源清理的操作。下面這篇文章主要介紹了python中atexit模塊的相關資料,需要的朋友可以參考下。
    2017-03-03
  • 解析Python中while true的使用

    解析Python中while true的使用

    這篇文章主要介紹了解析Python中while true的使用,while true即用來制造一個無限循環(huán),需要的朋友可以參考下
    2015-10-10
  • 分布式訓練training-operator和pytorch-distributed?RANK變量不統(tǒng)一解決

    分布式訓練training-operator和pytorch-distributed?RANK變量不統(tǒng)一解決

    這篇文章主要介紹了分布式訓練training-operator和pytorch-distributed?RANK變量不統(tǒng)一問題的解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Python 解決相對路徑問題:

    Python 解決相對路徑問題:"No such file or directory"

    這篇文章主要介紹了Python 解決相對路徑問題:"No such file or directory"具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • JAVA SWT事件四種寫法實例解析

    JAVA SWT事件四種寫法實例解析

    這篇文章主要介紹了JAVA SWT事件四種寫法實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • Python安裝xarray庫讀取.nc文件的詳細步驟

    Python安裝xarray庫讀取.nc文件的詳細步驟

    大家應該都知道庫xarray可以幫我們讀取出nc文件的內容,所以下面這篇文章主要給大家介紹了關于Python安裝xarray讀取.nc文件的詳細步驟,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • pycharm運行和調試不顯示結果的解決方法

    pycharm運行和調試不顯示結果的解決方法

    今天小編就為大家分享一篇pycharm運行和調試不顯示結果的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • python實現(xiàn)根據(jù)月份和日期得到星座的方法

    python實現(xiàn)根據(jù)月份和日期得到星座的方法

    這篇文章主要介紹了python實現(xiàn)根據(jù)月份和日期得到星座的方法,涉及Python操作字符串及數(shù)組的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • 基于Python制作打地鼠小游戲

    基于Python制作打地鼠小游戲

    這篇文章主要為大家介紹了如何利用Python實現(xiàn)打地鼠小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Django 表單模型選擇框如何使用分組

    Django 表單模型選擇框如何使用分組

    這篇文章主要介紹了Django 表單模型選擇框如何使用分組,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05

最新評論

利津县| 曲麻莱县| 阳谷县| 开阳县| 民丰县| 喀喇沁旗| 绥滨县| 垣曲县| 霍城县| 常山县| 佛坪县| 定襄县| 武山县| 扎赉特旗| 武安市| 班戈县| 康定县| 桓台县| 黑山县| 洛扎县| 平原县| 垣曲县| 临桂县| 武冈市| 五莲县| 象山县| 会理县| 通榆县| 都匀市| 峨边| 比如县| 常山县| 旺苍县| 武夷山市| 高台县| 万盛区| 西藏| 横峰县| 余庆县| 大埔区| 鞍山市|