2013-05-02 60 views
1

我正在嘗試編寫一個Python腳本,它會ping/icmp一個IP地址並告訴我它是否還活着。我這樣做是因爲我有一個間歇性問題。我想ping,記錄結果,睡一段時間,然後重新嘗試ping。我嘗試了一個while循環,但仍然得到這樣的錯誤:Python腳本 - 記錄失敗的icmp/ping響應 - 問題

line 33, in (module) systemPing('192.168.1.1') 
line 30, in systemPing time.sleep(30) 
KeyboardInterrupt 

我正在使用Python 2.6。

理想情況下,我的問題是我如何通過這個方法/函數systemPing循環以及在我的代碼中存在哪些錯誤?該腳本似乎工作,但我得到這些錯誤,當我點擊CTRL - C。

from subprocess import Popen, PIPE 
import datetime, time, re 

logFile = open("textlog.txt", "a") 

def getmyTime(): 
    now = datetime.datetime.now() 
    return now.strftime("%Y-%m-%d %H:%M \n") 

startTime = "Starting ..." + getmyTime() 
logFile.write(startTime) 
logFile.write("\n") 

def systemPing(x): 
    cmd = Popen("ping -n 1 " + x , stdout=PIPE) 
    #print getmyTime() 
    for line in cmd.stdout: 
     if 'timed out' in line: 
      loggedTime = "Failure detected - " + getmyTime() 
      logFile.write(loggedTime) 
     if 'Reply' in line: 
      print "Replied..." 
    logFile.close() 
    print "Sleeping 30mins ... CTRL C to end" 
    time.sleep(30) #1800 is 30mins 
    systemPing('192.168.1.1') 

if __name__ =='__main__': 
    systemPing('192.168.1.1') 

任何幫助總是讚賞。 謝謝。

回答

1

這實際上並不是一個錯誤,它只是Python的默認行爲,在收到SIGINT(這是按CTRL-C時發生的情況)時,會引發KeyboardInterrupt異常。

你會得到同樣的事情,如果你有kill(1),例如發送信號......

$ kill -INT <pid> 

如果你要處理它,那麼你可以將代碼更改爲類似...

if __name__ =='__main__': 
    try: 
     systemPing('192.168.1.1') 
    except KeyboardInterrupt: 
     print 'Finished' 

...或任何你想要它做的事情。

+0

好的,我明白了。我想知道爲什麼它似乎工作,但我得到我認爲是錯誤的。我沒有想到這種方法,但從未用過它。我將編輯腳本並測試。謝謝。 – user2105764 2013-05-02 15:13:09

+0

try/except語句不循環。它只運行一次並退出。積極的一面,沒有任何錯誤。 – user2105764 2013-05-02 17:05:21

+0

@ user2105764它不應該循環。我以爲你只是想讓CTRL-C在沒有錯誤信息的情況下退出程序。你真的想禁用CTRL-C嗎? – Aya 2013-05-02 17:08:16