web-dev-qa-db-ja.com

バックグラウンドでPythonスクリプトを実行し、クラッシュ後に再起動するにはどうすればよいですか?

Ubuntu 12.04サーバーで常に実行したい非常にシンプルなPythonスクリプトがあります。 upstart + monitを使用することを考えました。問題は、これらのツールが私のような単純な人間にとってはかなり複雑に見えることであり、Webで簡単な例を見つけることができないことです。

Upstart + monit overkillですか?誰かがより簡単な代替手段、またはupstart + monitの良いチュートリアルを知っていますか?スクリプトが常に実行されていることを確認したいだけの場合、monitはまったく必要ですか?

10
sebpiq

これを行う最も簡単な方法は、これを/etc/init/something.confに配置することです:

start on runlevel [2345]
stop on runlevel [016]

respawn
exec python /path/to/your/script.py

Respawnは、強制終了されるか、ゼロ以外で終了した場合(キャッチされなかった例外など)、バックアップを開始します。これはUbuntu 10.04に戻って機能します。

12.04をお持ちの場合は、さらにおしゃれになります。上記は、ルートとしてスクリプトを実行します。 12.04では、setuid/setgidを追加できます。

start on runlevel [2345]
stop on runlevel [016]

respawn
setuid nobody
setgid nogroup
exec python /path/to/your/python.py

使用可能なネットワークがないときにスクリプトが終了し、不安定なネットワーク接続で実行する予定がある場合は、それを修正して、そのまま稼働/再試行する必要があります。ただし、できない場合は、ネットワークデバイスが起動するたびに手動で起動する必要があります。これを/etc/network/if-up.d/yourscriptに配置できます(chmod + xで実行可能にします)

#!/bin/sh
exec start wait-for-state WAITER=$IFACE-yourscript WAIT_FOR=something

Yourscriptは、この特定のスクリプトに固有のarbitrary意的なものであり、「something」はジョブ名と同じです(前述の/etc/init/something.confなど)。

16
SpamapS

昔からの通常のアプローチは、タイムスタンプまたはプロセスIDを含むファイルを/tmpに書き込み、このプロセスIDがまだ実行されているかどうか、またはタイムスタンプがまだ最新であったかどうかを確認することでした。

また、単純なwhile [ 1 ]; do phyton-script.ph; doneを実行して、スクリプトが返された場合にスクリプトを再起動することもできます。

より多くの可能性については、スクリプトに関する詳細情報を提供してください。特に、予期せず終了またはクラッシュすると予想される理由について。

2
con-f-use