2012-02-18 10 views
4

私はプログラミングに多少初心者ですが、ほとんど独学ですので、初心者の方には少し申し訳ありません。実行中のスクリプトが死ぬかどうかを知る方法?

私は長い間実行されるpythonスクリプトを持っています(たとえば、一度に数秒ごとに数秒ごとにページをダウンロードします)。Webアプリケーションの監視スクリプトの並べ替え。

何度も、何かが中断し、再起動する必要があります。私はこれらの出来事を最小限に抑えていますが、それは数日おきに起こります。死ぬと、数時間気付かないと悪いニュースになることがあります。

今はVPSのスクリーンセッションで実行されています。

誰かが正しい方向に向かって、スクリプトがいつ死ぬかを知っていて、それを自動的に再起動させることができますか?

これはBashで記述するものですか?または、他の何か?私はこれまでのようなことは一度もしていないし、どこから始めるべきか、あるいは情報を探すことすら知らない。

+0

コード内でこれを実行する必要があります。なぜそれが死ぬだろうか? – Blender

+0

監視フックも入れておくことができます。一時ファイルに触れたり、数秒ごとにログ出力を生成したりすることができます。別のウォッチドッグを(別のホスト上であっても)簡単にセットアップすることができます。 – tripleee

答えて

3

ループ内でPythonスクリプトを実行するラッパーbashスクリプトは、このトリックを行うべきだと考えています。

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

これが役立ちます。

+1

スクリプトを(daostize)(http://stackoverflow.com/a/9346830/462302)、スクリプト内で例外を適切に処理してください(少なくともログに記録すること)。 – aculich

2

これは、保護したい障害の種類によって異なります。何かがPythonのプロセスを強制終了された場合、それはシェルでそれを実行するのが最も簡単かもしれません

import logging as log 

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

:それはただのスクリプトクラッシュだ場合は、最も簡単な方法は除いて/試しにあなたの主な機能をラップすることですループ:

while sleep 1; do python checker.py; done 

マシンがダウンしているためにクラッシュしていても...うーん...クスの管理人のipsos custodes?

しかし、直接あなたの質問に答える:それはシェルから実行しているかどうかを確認するために絶対的な最も簡単な方法は、psの出力をgrepするために、次のようになります。

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

、これはばかプルーフされていませんそれは一般的には十分です。

4

supervisordは、デーモンプロセスを制御するツールです。

2

プログラムをデーモン化する必要があります。

Efficient Python Daemonで説明したように、あなたがpython-daemonをインストールして使用することができますPEP 3143の行儀のデーモンの仕様、「標準的なデーモンプロセスライブラリ」を実装しています。実際に使用し、それを実行するには

#!/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 

DaemonContextdo_something()を起動し、その後スクリプトmydaemon.pyが終了します

は、このような内容のファイルmydaemon.pyを作成します。実行中のデーモンは、pgrep -fl mydaemon.pyと表示されます。この短い例では、ログファイルにエラーを単にログに記録します(/tmp/mydaemon.log)。手動でデーモンを終了する必要があります。デーモンを無期限に実行する必要があります。

独自のプログラムを実行するには、tryブロックの内容をコードに置き換えてください。

+0

ありがとう、これは非常に解明しています。私はまったくデモンストレーションを知らなかった。 – some1

関連する問題