質問
私は、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を確認している限り(それだけで簡単に私見です)コマンドラインのルートを行くと思います。