サブプロセスから起動されたボトル Web サーバーを停止する方法
-
27-09-2019 - |
質問
素晴らしいものを埋め込みたいと思います ボトル Web フレームワークを小さなアプリケーションに組み込みます (最初のターゲットは Windows OS)。このアプリは、サブプロセス モジュールのおかげでボトル Web サーバーを開始します。
import subprocess
p = subprocess.Popen('python websrv.py')
ボトルアプリは非常にシンプルです
@route("/")
def index():
return template('index')
run(reloader=True)
これにより、デフォルトの Web サーバーが Windows コンソールで起動されます。
ボトル Web サーバーを閉じるには Ctrl-C を押す必要があるという点を除けば、すべて問題ないようです。マスターアプリがシャットダウン時にWebサーバーを終了するようにしたいと思います。それを行う方法が見つかりません(残念ながら、この場合 p.terminate() は機能しません)
何か案が?
前もって感謝します
解決
シャットダウンする二つの方法リロードサーバーがあります:
1)あなたはos.kill(p.pid)
またはp.terminate()
を使用した(pを終了)した後、子プロセスの自動シャットダウンをトリガする「websrv.py」(os.utime('websrv.py')
)の修正時刻を変更します。
2)あなたはos.kill(p.pid, signal.SIGINT)
シャットダウンと同一ですCtrl-C
とPを終了します。
他のヒント
ボトルは、リロードモードである場合に終了するプロセスが動作しないようです。この場合、それはiteselfサブプロセスを開始します。
リロードがFalseに設定されている場合は、終了するには、[OK]を動作するようです。
0.8.1 以降、リロード サーバーは孤立したプロセスをクリーンアップするのに十分な機能を備えています。サーバーを終了するにはいくつかの方法があります。
- 打つ
Ctrl-C
または送信しますSIGINT
親プロセスに。(推奨) - 親プロセスを強制終了します。子供は2秒以内に潔く死ぬだろう。
- 3 以外のステータス コードで子プロセスまたは sys.exit() を強制終了します。親はすぐに死ぬ。
私はトラブルボトルは、サブプロセスで要求を実行するように見えるよう要求内からボトルサーバを閉じていた。
私は最終的に解決策を行うことがわかった。
sys.stderr.close()
(ボトルサーバまで渡され、それを打ち切らしまった)要求内の
たぶん、あなたのプロセスでそれをやって試してみて、ボトルがメッセージを取得するかどうかを確認します。