3

次のシェルスクリプトの使用を開始するPythonで記述されたスレッドサーバーがあります。

#!/bin/bash

base_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

public_dns=$(curl -s http://169.254.169.254/latest/meta-data/public-hostname)
echo $public_dns > "$base_path/client/address"

cd "$base_path/server"
python "server.py" &
echo $! > "$base_path/server_pid"
echo "Server running"

別のシェルスクリプトを使用してサーバーをシャットダウンできるように、PIDをファイルにエコーします。

#!/bin/bash

base_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

kill -9 `cat "$base_path/server_pid"`
rm "$base_path/server_pid"
rm "$base_path/client/address"

ただし、サーバーにネットワークとhddへのI / Oを持つスレッドが多数あることを考えると、これは悪いアプローチであることを私は知っています...したがって、私がやりたいのは、2番目のスクリプトをサーバーと対話させて次のように指示することです。すべてのスレッドをクリーンに閉じ、ログを閉じてアーカイブするシャットダウンシーケンスを開始します。

今、私はatexitについて知っており、次のようにテストしました。

import atexit
def byebye(o):
    o.write('stop')
    o.flush()
    o.close()

o = open('log','w')
o.write('start')
o.flush()

atexit.register(byebye, o)

while True:
    pass

しかし、私kill -9がプロセスするとき、byebye()解雇されません。全能者kill -9以外のコマンドを使用する必要がありますか?プロセスをシャットダウンするにはどうすればよいですか?

4

3 に答える 3

5

あなたはデーモンを実装しようとしているようです。Python でのデーモンの実装に関するさまざまな参照があります。

前の stackoverlow の質問: Python でデーモンを作成するにはどうすればよいですか?

デーモンに関する PEP : http://www.python.org/dev/peps/pep-3143/

PEP3143 を実装する python モジュール : http://pypi.python.org/pypi/python-daemon/

PEP はドラフトであることに注意してください。

デーモンの詳細: http://en.wikipedia.org/wiki/Daemon_%28computing%29

通常、デーモンは次のように開始、停止、および再起動されます。

mydaemon start
mydaemon stop
mydaemon restart

したがって、それを停止するために PID などを知る必要はありません。

于 2012-07-18T15:17:21.957 に答える
1

kill 9アトミックパワーです-自分で後片付けをする必要はありません。より良いアプローチは、別のより穏やかなシグナルをHUP使用し (たとえば、サーバー プロセスにシャットダウンのタイミングを知らせるために一般的に使用されます)、それを適切に処理する方法を Python コードに教えることです。

シグナルモジュールのドキュメンテーションは、あなたを始めるのに役立つはずです。

于 2012-07-18T15:21:55.267 に答える
1

kill -9私はスレッドを使ったプログラミングに特に慣れていませんが、 ( に対応するSIGKILL) を送信するのではなく、SIGINTまたは他のユーザー定義のシグナルを送信することができます。 SIGINTkill -2私のシステムでは)それはすでにPythonで理解されているのでいいです。(Pythonがそのシグナルをキャッチすると、が発生しますKeyboardInterrupt)が、どのシグナルも機能します。プログラムを正常に終了するシグナル ハンドラを登録するだけです。

于 2012-07-20T12:11:41.397 に答える