次のシェルスクリプトの使用を開始する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
以外のコマンドを使用する必要がありますか?プロセスをシャットダウンするにはどうすればよいですか?