2012-02-18 146 views
4

所以我對編程有點新,大多是自學的,所以很抱歉,如果這個問題有點新手。如何知道正在運行的腳本是否死亡?

我有一段長時間運行的python腳本(例如,它每隔幾秒就會每隔幾秒就下載一次頁面)。爲web應用程序分配一個監視腳本。

每隔一段時間,一些東西都會中斷它,並且需要重新啓動。我已經將這些事件減少到了最低限度,但是它每隔幾天就會發生一次,當它發生死亡時,如果我沒有注意到幾個小時,這可能是個壞消息。

現在它正在VPS上的屏幕會話中運行。

只要知道腳本何時死亡/並讓它自動重啓,誰能指出我正確的方向?

這是寫在Bash的東西嗎?或者是其他東西?我從來沒有做過像這樣的事情,也不知道從哪裏開始或者甚至是尋找信息。

+0

你應該在你的代碼中這樣做。爲什麼會死? – Blender 2012-02-18 07:49:00

+0

您可能還想要放入監視掛鉤 - 使其觸摸臨時文件或每隔幾秒生成一些日誌輸出;那麼你可以很容易地設置一個單獨的看門狗(即使在不同的主機上)。 – tripleee 2012-02-18 13:14:36

回答

3

我相信一個在循環中執行python腳本的包裝bash腳本應該可以做到。

while true; do 
    # Execute python script here 
    echo "Web app monitoring script disrupted ... Restarting script." 
done 

希望這會有所幫助。

+1

最好[守護進程](http://stackoverflow.com/a/9346830/462302)腳本並正確處理內部的異常(至少要記錄它們)。 – aculich 2012-02-19 04:54:37

2

這取決於您要防範的失敗類型。如果它只是劇本崩潰,做最簡單的事情是將包裝你的主要功能在try /除外:

import logging as log 

while True: 
    try: 
     main() 
    except: 
     log.exception("main() crashed") 

如果事情是殺害Python的過程中,它可能是最簡單的在一個shell中運行它循環:

while sleep 1; do python checker.py; done 

如果它是因爲機器正在關閉而崩潰......那麼......請問您的問題?

然而,直接回答你的問題:絕對的最簡單的方法來檢查它是否從殼體會到grep的ps輸出:

ps | grep "python checker.py" 2>&1 > /dev/null 
running=$? 

當然,這不是防呆,但它通常是很好的。

4

你可以試試supervisord,它是一個控制守護進程的工具。

2

您應該守護程序。

Efficient Python Daemon描述,您可以安裝和使用它實現的PEP 3143乖巧守護規範python-daemon,「標準守護進程庫」。

創建一個文件mydaemon.py與內容是這樣的:

#!/usr/bin/env python 

import daemon 
import time 
import logging 

def do_something(): 
    name = 'mydaemon' 
    logger = logging.getLogger(name) 
    handler = logging.FileHandler('/tmp/%s.log' % (name)) 
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') 
    handler.setFormatter(formatter) 
    logger.addHandler(handler) 
    logger.setLevel(logging.WARNING) 

    while True: 
     try: 
      time.sleep(5) 
      with open("/tmp/file-does-not-exist", "r") as f: 
       f.write("The time is now " + time.ctime()) 
     except Exception, ex: 
      logger.error(ex) 

def run(): 
    with daemon.DaemonContext(): 
     do_something() 

if __name__ == "__main__": 
    run() 

要實際運行使用它:

python mydaemon.py 

這將釀出DaemonContext然後腳本mydaemon.py將退出中do_something()。您可以看到正在運行的守護進程:pgrep -fl mydaemon.py。這個簡短的例子將簡單地將錯誤記錄到/tmp/mydaemon.log中的日誌文件。您需要手動殺死守護進程,否則它將無限期地運行。

要運行您自己的程序,只需用您的代碼調用替換try塊的內容即可。

+0

謝謝,這是非常明確的。我根本沒有意識到守護進程。 – some1 2012-02-29 02:52:26

相關問題