2012-07-09 103 views
0

我有一個python腳本(運行在Mac OS X上),當互聯網出現故障時需要重新啓動它。如果互聯網停機,我想殺死當前的腳本,等待互聯網恢復,然後重新啓動它。或者,如果可能的話,從內部重新啓動該功能。如果互聯網出現故障,重新啓動python腳本

的Python代碼的存在問題的部分如下:

import tweetstream 

    # ... 

    with tweetstream.FilterStream(username, password, track = words) as stream: 
     for tweet in stream: 
      db.tweets.save(tweet) 

目前,如果網絡出現故障,流將停止,並且不重新連接。

+6

如果整個互聯網都做了,我們將會有比你的腳本更嚴重的問題。 :P – 2012-07-09 04:18:24

+1

http://istheinternetdown.com/ – blindjesse 2012-07-09 05:07:24

回答

1

它取決於操作系統。有幾個特定的​​方法。 第一個跨平臺方法將是自己的ping,它將發送一些數據包到Internet服務器。如果您無法收到信息,說明互聯網已關閉。

1

嘗試使用this python implementation of ping作爲子流程。因此,如果發生過多超時,那麼您將知道網絡已關閉,您可以重新啓動推文過程(但是,要執行此操作,您應該將整個推文過程設置爲自己的功能)

+0

+1爲偉大的鏈接:)。但如果該項目簡短而簡單,那麼這可能會是一個過度消耗。 – tarashish 2012-07-09 06:31:11

0

也許你可以嘗試這樣的事:

import urllib2 

def internet_on(): 
    try: 
     response=urllib2.urlopen('http://74.125.131.94/',timeout=1) 
     return True 
    except urllib2.URLError as err: pass 
    return False 

74.125.131.94是google.co.in的IP地址。您可以使用任何您認爲會更快響應的網站。使用數字IP地址可避免DNS查找,這可能會阻止urllib2.urlopen調用。timeout = 1參數確保即使Internet不可用,對urlopen的調用也不會超過1秒。

現在你只需要調用internet_on()函數。如果連接是on,則返回true,否則返回false。那麼你可能想要將所有的推文代碼包裝在一個函數中並調用它。 (建議使用@inspectorG4dget)。

編輯: 對於連續檢查,你可以做類似

def check(): 
    while not internet_on(): 
     pass 
    print "internet connection is on" 
    // call the tweet stuff function here. 

那麼當你流站就調用檢查()函數,當互聯網連接恢復,就會打電話給你的鳴叫功能重新啓動它。

+0

謝謝Tarashish。我目前有這樣的代碼,所以我可以檢查網絡是否啓動,但我不確定如何每隔30秒檢查一次,並在出現故障時重新啓動該功能。任何幫助,將不勝感激。 – Gregory 2012-07-09 13:18:43

+0

編輯了一下。看看它是否做到了你想要的。 – tarashish 2012-07-09 15:45:55