基本的にPythonプログラムであるプロセスを常に監視しようとしています。プログラムが停止した場合は、プログラムを再度開始する必要があります。そのために別の Python プログラムを使用しています。
たとえば、 というプロセスを常に実行する必要があるとしrun_constantly.py
ます。最初にこのプログラムを手動で実行すると、そのプロセス ID がファイル「PID」(out/PROCESSID/PID の場所) に書き込まれます。
ここで、Linux 環境からプログラムを監視するために、次のコードを持つ別のプログラムを実行します。run_constantly.py
def Monitor_Periodic_Process():
TIMER_RUNIN = 1800
foo = imp.load_source("Run_Module","run_constantly.py")
PROGRAM_TO_MONITOR = ['run_constantly.py','out/PROCESSID/PID']
while(1):
# call the function checkPID to see if the program is running or not
res = checkPID(PROGRAM_TO_MONITOR)
# if res is 0 then program is not running so schedule it
if (res == 0):
date_time = datetime.now()
scheduler.add_cron_job(foo.Run_Module, year=date_time.year, day=date_time.day, month=date_time.month, hour=date_time.hour, minute=date_time.minute+2)
scheduler.start()
scheduler.get_jobs()
time.sleep(TIMER_NOT_RUNIN)
continue
else:
#the process is running sleep and then monitor again
time.sleep(TIMER_RUNIN)
continue
checkPID()
ここには関数を含めていません。checkPID()
基本的に、プロセス ID がまだ存在するかどうか (つまり、プログラムがまだ実行中かどうか) をチェックし、存在しない場合は を返します0
。上記のプログラムでは、 をチェックres == 0
し、そうであれば、Python のスケジューラを使用してプログラムをスケジュールします。しかし、私が現在直面している大きな問題は、関数を使用してスケジュールすると、このプログラムとrun_constantly.py
プログラムのプロセス IDが同じになることです。そのため、プログラムがクラッシュした場合でも、次のプログラムは が実行中であると見なし (両方のプロセス ID が同じであるため)、else ループに入り続けてスリープし、再び監視します。run_constantly.py
scheduler.add_cron_job()
run_constantly.py
run_constantly.py
誰かがこの問題を解決する方法を教えてもらえますか? プログラムを常に監視し、クラッシュしたときにスケジュールを変更する簡単な方法はありますか?