2012-02-10 6 views
1

私は現在Python webserverアプリケーションを実行していますが、アプリケーションが起動しているかどうかを確認するにはpythonスクリプトを使用します。cronジョブを使用してpythonスクリプトが実行されているかどうかをチェック

私は以下のように次のコードを持っている:

import os 

string = os.popen('ps aux') 
n = 0 
for line in string.readlines(): 
    if "python webserver.py" in line: 
    n+=1 
if n < 1: 
    os.system('python webserver.py') 

今、スクリプトがアプリケーションを実行しました。しかし、私が望むのは、スクリプトがアプリケーションを起動して終了し、アプリケーションを実行し続けることです。そうする方法はありますか?前もって感謝します。

+0

代わりに、単純なシェルスクリプトでこれを実行します。バックグラウンドで実行するには、コマンドの最後に '&'文字を使用します。 – wim

答えて

1

は、システムコマンドを変更してみてください。シンプルでエラーの可能性が低い一般的に私はこのループを最後に睡眠中のループに入れますが、cronもうまく動作します。

if [ -x myproc.pid ] ; then 
    pid=`cat myproc.pid` 
else 
    pid=1 
fi 
kill -0 $pid #check if process is still running 

ご覧のとおり、起動時にPIDをファイルに書き込む必要があります。これにより、将来、新しいプロセス名があなたのサーバーに来るかどうかにかかわらず常に動作する正規表現を取得するのが難しくなる可能性があるため、ps出力のグロップに関する問題が回避されます。 PIDファイルは死んでいます。

kill -0は、プロセスが実行されているかどうかを確認する方法として知られており、/procのディレクトリを確認するよりも簡単です。チェッカーがrootではないので、pid=1の行はそこにあります。したがって、プロセスにシグナルを送信できない場合、キルチェックは常に失敗します。これは、myprocがこのサーバー上で実行された初めてのことです。これは、チェックスクリプトがroot(一般的には良い方法)として実行されてはならず、チェックしているプロセスを実行する同じユーザーとして実行する必要があることに注意してください。

実際にPythonでこれを行う場合は、osモジュールはPIDにアクセスでき、killメソッドを持っています。ただし、シェル終了コードは返されません。代わりにos.killが - catchブロックで処理できる例外OSErrorをスローします。同じ原則がシグナル0を使用してプロセスが存在するかどうかを検出しますが、プロセスが停止して別のプロセスのpidが同じになる可能性は低いため、try - catchにそのケースを処理します。

2

ウェブサーバーにプロセスIDをファイルに書き込ませてから、cronジョブでそのプロセスを読み込んでプロセスが実行されているかどうかを確認するとよいでしょう。

os.systemを使用して手動で起動するのではなく、プロセス管理(スーパーバイザー、起動など)を行うフレームワークを使用することも有益です。

0

おそらく、バックグラウンドでアプリケーションを起動し、ハングアップ信号の影響を受けないようにすることができます。私は次のようなシェルスクリプトでこれを行うのが好き

nohup python webserver.py & 
関連する問題