5

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

基本的に行うwhileループの実装を検討しています

ps -ef | grep process name

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

4

6 に答える 6

5

なぜ自分で実装するのですか?デーモンや Debian のような既存のユーティリティstart-stop-daemonは、寿命の長いサーバー プロセスの実行に関するその他の困難な問題を解決する可能性が高くなります。

とにかく、サービスを開始するときは、その pid を入力し/var/run/<name>.pidてから、psコマンドでそのプロセス ID を検索し、それが正しいプロセスであることを確認します。Linux では、単に見/proc/<pid>/exeて、正しい実行可能ファイルを指していることを確認できます。

于 2009-05-23T18:50:19.750 に答える
3

init を再発明しないでください。お使いの OS には、システム リソースをほとんど必要とせずにこれを実行する機能があり、再現できるものよりも確実に優れた信頼性で実行されます。

クラシック Linux には /etc/inittab があります

Ubuntu には /etc/event.d (upstart) があります。

OS X が起動しました

Solarisにはsmfがあります

于 2009-05-23T19:22:54.020 に答える
1

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

#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()
于 2009-05-23T20:55:14.270 に答える
1

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

于 2011-10-07T01:08:17.807 に答える
0

自分で試したことはありませんが、プロセスを見つけてそれらに関する情報を取得するために使用できるPython System Informationモジュールがあります。AFAIRProcessTable実行中のプロセスを検査するために使用できるクラスがありますが、十分に文書化されていないようです...

于 2009-05-23T18:31:42.430 に答える
0

私はコマンドラインルートに行きます(それは簡単です)、1秒または2秒ごとにチェックするだけで、10年未満のシステムで利用可能な処理と比較して、リソースの使用量がごくわずかになるはずです。

于 2009-05-23T18:42:11.573 に答える