質問

私は、Pythonを使用したときに、プログラムがクラッシュしたり、実行されていない検出し、それを再起動する必要があります。私は必ずしも親プロセスであることのpythonモジュールに依存しない方法を必要とします。

私はwhileループを実装検討しているという、本質的に行います。

ps -ef | grep process name

とプロセスが見つからない場合には、別のものを開始します。おそらくこれは、最も効率的な方法ではありません。私はおそらくすでにこれを実行するPythonのモジュールがあるのpythonに新しいです。

役に立ちましたか?

解決

なぜそれを自分で実装しますか? デーモンのか、Debianのstart-stop-daemonのような既存のユーティリティは、長寿のサーバの実行に関する他の困難なものの権利を取得する可能性が高いですプロセスます。

とにかく、あなたがサービスを開始すると、/var/run/<name>.pidにそのPIDを配置し、あなたのpsコマンドだけではプロセスIDを探し、それが右のプロセスであることを確認します。 Linuxでは、あなたは、単にそれが正しい実行ファイルを指していることを確認するために/proc/<pid>/exeで見ることができます。

他のヒント

のinitを改革しないでください。お使いのOSはほとんどありませんシステムリソースを必要とし、間違いなくあなたが再現することができます何よりも、より良く、より確実にそれを行いますそのこれを行うための機能を備えています。

クラシックLinuxは持っているの/ etc / inittabの

Ubuntuは/etc/event.dた(新興)

OS Xがのlaunchdた。

SolarisはSMFました。

次のコードは、所定の間隔で所定のプロセスをチェックし、それを再起動します。

#Restarts a given process if it is finished.
#Compatible with Python 2.5, tested on Windows XP.
import threading
import time
import subprocess

class ProcessChecker(threading.Thread):
    def __init__(self, process_path, check_interval):
        threading.Thread.__init__(self)
        self.process_path = process_path
        self.check_interval = check_interval

    def run (self):
        while(1):
            time.sleep(self.check_interval)
            if self.is_ok():
                self.make_sure_process_is_running()

    def is_ok(self):
        ok = True
        #do the database locks, client data corruption check here,
        #and return true/false
        return ok

    def make_sure_process_is_running(self):
        #This call is blocking, it will wait for the
        #other sub process to be finished.
        retval = subprocess.call(self.process_path)

def main():
    process_path = "notepad.exe"
    check_interval = 1 #In seconds
    pm = ProcessChecker(process_path, check_interval)
    pm.start()
    print "Checker started..."

if __name__ == "__main__":
    main()

多分あなたが必要な http://supervisord.orgする

私はそれを自分自身を試していないが、 Pythonのシステム情報のモジュールが存在していますプロセスを検索し、それらの情報を取得するために使用することができます。 AFAIRは、実行中のプロセスを検査するために使用することができるProcessTableクラスがありますが、非常によく文書化されていないようだ...

私はあなただけのリソース使用量がより少ない10歳のいずれかのシステム上で利用可能な処理に比べて無限小でなければなりません毎秒または2を確認している限り(それだけで簡単に私見です)コマンドラインのルートを行くと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top