2016-04-21 65 views
0

我已經創建了一個小型python腳本來監視OS(Linux)是否能夠ping 10.0.0.1(局域網上的路由器)的某個IP地址。這第一個腳本工作正常,但我必須執行腳本,讓它每次評估條件。Python檢查循環變化中的條件

我想我明白這個腳本只是在條件評估後退出。我試圖在下面的第二個例子中包含一個while循環,它計算OS調用的返回值,並將此函數調用放在循環中以繼續檢查路由器是否被插回局域網。

定義函數以評估ping狀態的正確方法是?我嘗試在最後一個示例中添加一個函數,但似乎沒有更新。

我的目標是,一旦運行該腳本,並使其檢測是10.0.0.1是漲還是跌,當我從網絡中斷開,或插回。

import os 
    import time 

    ip = "10.0.0.1" 
    response = os.system("ping -c 1 " +ip) 

    if response != 0: 
      print ip, 'is down' 
      time.sleep(3) 

    else: 
     print ip, 'is up!' 

我嘗試添加雖然其他循環,但條件似乎並沒有得到更新。

import os 
    import time 

    ip = "10.0.0.1" 
    response = os.system("ping -c 1 " +ip) 

    while response != 0: 
      print ip, 'is down' 
      time.sleep(3) 

    else: 
    print ip, 'is up!' 

我甚至嘗試定義機能的研究,以評估該循環的每次反覆的條件..

import os 
    import time 


    ip = "10.0.0.1" 
    response = os.system("ping -c 1 " +ip) 

    def checkstatus(): 
      response = os.system("ping -c 1 " +ip) 

    while response != 0: 
      print ip, 'is down' 
      time.sleep(3) 
      checkstatus()# trying to evaluate if status has changed 

    while response != 1: 
      print ip, 'is up' 
      time.sleep(3) 
      checkstatus()# trying to evaluate if status has changed 

編輯

我這是怎麼改劇本和現在它工作..只需要減慢網絡不可達標準輸出。連接

import os 
    import time 

    ip = "10.0.0.1" 
    while True: 
      response = os.system("ping -c 1 " + ip) 
      if response == 0: 
        print'connected' 
        time.sleep(.5) 

新的輸出注意print語句出現連接

--- 10.0.0.1 ping statistics --- 
    1 packets transmitted, 1 received, 0% packet loss, time 0ms 
    rtt min/avg/max/mdev = 0.383/0.383/0.383/0.000 ms 
    **connected** 
    PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. 
    64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.308 ms 

    --- 10.0.0.1 ping statistics --- 
    1 packets transmitted, 1 received, 0% packet loss, time 0ms 
    rtt min/avg/max/mdev = 0.308/0.308/0.308/0.000 ms 
    ***connected*** 

新建輸出後拔出幾秒鐘(洪水屏)

connect: Network is unreachable 
    connect: Network is unreachable 
    connect: Network is unreachable 
    connect: Network is unreachable 
    connect: Network is unreachable 

沒有什麼太不好但擔心這會使用很多CP U週期,因爲這個腳本將 在樹莓派上運行。

+0

確保你'time.sleep(0.5)'是'if'聲明之外,否則它不會在執行失敗case(ping正在旋轉back2back)... –

回答

0

對於您的第二次嘗試(使用功能),我認爲正在發生的事情是,response被定義爲功能checkstatus,這是從全球varriable response獨立的局部變量。要從函數中重新分配全局(而不是局部變量),請將global response行添加到函數體的頂部。

+0

我試着添加全局響應語句,但它看起來像while循環沒有檢查或響應ping狀態的變化。 – Brad

0

用簡單的方式是使用while True

ip = "10.0.0.1" 
while True: 
    response = os.system("ping -c 1 " + ip) 
    if response == 0: 
     break # or do anything else 
     time.sleep(3) 

更好的方法是讓腳本做出os.system一個電話,然後使用crontab或Windows計劃程序來運行它的時候每X量。

+0

我希望能夠保存在一個簡單的python腳本中。目的是始終監聽此IP進行響應,然後執行curl調用以登錄到路由器,驗證並POST一些信息。目標是自動化路由器配置。當條件評估爲真時,我將爲此腳本添加其他功能。 – Brad

2

您所犯的錯誤是您在response中查找更改,它不反映網絡狀態更改,除非您通過response = os.system("ping -c 1 " +ip)重複指定它。

除了包括你的循環內的分配(由DeepSpace所建議的),你也可以改變回路檢查本身,以正確反映網絡狀態的變化(根據你的方法):

while os.system("ping -c 1 " +ip): 
    print ip, 'is down' 
    time.sleep(3) 

同樣,當使用checkstatus()你需要在循環中包含response = checkstatus()或在支票中使用它:while checkstatus():

你的代碼的最後版本有一些額外的問題:

  • 一般程序的返回碼是0上的成功,但也可能有多個非零返回代碼,所以你!= 1檢查可能不能像你期望的那樣工作,更好地使用== 0檢查。

  • 如果沒有發生連接狀態的某個順序,那麼排序的潛在的無窮無盡的while語句將不會實際完成。既然你的目標是簡單地運行一次並找出連接的當前狀態,那麼代碼最好不依賴於這樣的順序。

也許是這樣的呢?

if os.system("ping -c 1 " +ip): 
    print ip, 'is down' 
else: 
    print ip, 'is up' 

或者,如果你喜歡的俏皮話:

print ip, 'is ' + 'down' if os.system("ping -c 1 " +ip) else 'up' 
+0

是的,那工作! 請參閱上面的編輯以獲取新輸出。另外,謝謝。我認爲返回true爲1,false爲零。 – Brad