8

基本的に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.pyscheduler.add_cron_job()run_constantly.pyrun_constantly.py

誰かがこの問題を解決する方法を教えてもらえますか? プログラムを常に監視し、クラッシュしたときにスケジュールを変更する簡単な方法はありますか?

4

4 に答える 4

10

これを行うことができる多くのプログラムがあります。

Ubuntuにはupstartがあります(デフォルトでインストールされます)

多くの人がhttp://supervisord.org/を気に入っています

@nathanが言及したmonit

Python の代替を探している場合は、サーカスと呼ばれるリリースされたばかりの興味深いライブラリがあります。

そして、ほぼすべての Linux ディストリビューションには、おそらくこれらのいずれかが組み込まれています。

どちらを選択するかは、実際にはどちらが好きかによるものですが、自分で作成するよりも、これらのいずれかを使用する方がはるかに優れています。

それが役立つことを願っています

于 2012-11-28T05:58:59.423 に答える
2

監視対象のプログラムを cron を使用する代わりに Python から直接制御したい場合は、サブプロセスモジュールをご覧ください。

The subprocess module allows you to spawn new processes,
connect to their input/output/error pipes, and obtain their return codes.

例とリファレンスについては、SOで Python を使用してプロセス ステータスを追跡するなどの例を確認してください。

于 2012-11-28T06:22:05.277 に答える
1

monit http://mmonit.com/monit/を使用できます

プロセスを監視し、それらを再起動します (およびその他のもの)。

于 2012-11-28T05:41:16.697 に答える