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


10

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

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


参考までに、同じ質問がここで行われました:superuser.com/q/461546/786969
PHPirate

回答:


16

これを行う最も簡単な方法は、次の場所に配置することです/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を使用している場合は、さらに豪華になります。上記はrootとしてスクリプトを実行します。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

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


うん!これはupstart正しく使用していますか?これは、スクリプトが起動時にも開始されることを意味しますか(これはすばらしいでしょう)。そしてrespawn、セットアップする必要がないように十分monitですか?
sebpiq 2012

はい、「ランレベル[2345]で開始」は、システムが「マルチユーザーモード」に入った時点を意味します。長期的には、非常に古いユニキシ「ランレベル」を「ネットワークサービスの開始時に開始」や「ネットワークサービスの停止時に停止」などに置き換えて、より論理的に読み取れるようにする計画が立てられています。
SpamapS 2012

驚くばかり !本当にありがとうございました。
sebpiq 2012

2

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

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

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


スクリプトは、ストリーミングAPIを使用してTwitterからツイートをスクラップするだけです。つまり、基本的には、ツイートがプッシュされるのを待ち、コードを実行して、再び待機する無限ループがあります。...バグがあります場合、私はちょうど...これは気にせずに実行することにしたい、それがクラッシュする、など
sebpiq

(私は受け入れられて)あなたに似た答え:superuser.com/questions/461546/...
sebpiq

また、スクリプトがまだ実行されているかどうかを確認するcronジョブも良いアイデアかもしれません。
con-f-use
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.