プログラムがクラッシュしたり、Python を使用して実行されていないことを検出して再起動する必要があります。親プロセスであるpythonモジュールに必ずしも依存しないメソッドが必要です。
基本的に行うwhileループの実装を検討しています
ps -ef | grep process name
プロセスが見つからない場合は、別のプロセスを開始します。おそらく、これは最も効率的な方法ではありません。私はPythonが初めてなので、おそらくこれを行うPythonモジュールが既にあります。
なぜ自分で実装するのですか?デーモンや Debian のような既存のユーティリティstart-stop-daemonは、寿命の長いサーバー プロセスの実行に関するその他の困難な問題を解決する可能性が高くなります。
とにかく、サービスを開始するときは、その pid を入力し/var/run/<name>.pidてから、psコマンドでそのプロセス ID を検索し、それが正しいプロセスであることを確認します。Linux では、単に見/proc/<pid>/exeて、正しい実行可能ファイルを指していることを確認できます。
init を再発明しないでください。お使いの OS には、システム リソースをほとんど必要とせずにこれを実行する機能があり、再現できるものよりも確実に優れた信頼性で実行されます。
クラシック Linux には /etc/inittab があります
Ubuntu には /etc/event.d (upstart) があります。
OS X が起動しました
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()
自分で試したことはありませんが、プロセスを見つけてそれらに関する情報を取得するために使用できるPython System Informationモジュールがあります。AFAIRProcessTable実行中のプロセスを検査するために使用できるクラスがありますが、十分に文書化されていないようです...
私はコマンドラインルートに行きます(それは簡単です)、1秒または2秒ごとにチェックするだけで、10年未満のシステムで利用可能な処理と比較して、リソースの使用量がごくわずかになるはずです。