4

次のコードがあります。$pub->closestarman サーバーが HUP シグナルを受信したときにメソッドを呼び出したい。

  • 子プロセスが終了したことをどのように知ることができますか?
  • END {} ブロックを使用できますか? 私はこれを試しましたが、plackup が (編集後に) 再起動するとうまくいくようです。私はスターマンでこれを試しました。HUP シグナルを送信しましたが、子プロセスが再起動されません。
  • HUP のシグナル ハンドラーをインストールする必要がありますか? それはどのように機能しますか?

子プロセスがブロックされないと、子が再起動する前にクリーンアップしたいと思います。

これは私が使用する .psgi ファイルです。

use ZMQ;
use ZMQ::Constants ':all';
use Plack::Builder;

our $ctx = ZMQ::Context->new(1);
my $pub = $ctx->socket(ZMQ_PUB);
$pub->bind('tcp://127.0.0.1:5998');

# I want to close the socket and terminate the context
# when the server is restarted with kill -HUP pid
# It seems the children won't restart because the sockets isn't closed.
# The next two lines should be called before the child process ends.

# $pub->close;
# $ctx->term;

builder {
    $app
}
4

1 に答える 1

2

PSGI アプリケーションがプロセスごとのクリーンアップ ハンドラを登録する標準的な方法はなく、Starman は直接使用できるものを実装していないようです。しかし、プロセスの終了時に Starman に何らかのコードを実行するモンキー パッチを適用することはできます。

Starman は Net::Server::PreFork に基づいており、child_finish_hook() 自体を使用しないため、.psgi ファイルにこれを挿入することで、この Net::Server::PreFork フックをオーバーライドできます。

sub Starman::Server::child_finish_hook {
    $pub->close();
    $ctx->term();
}

クリーンアップのための END ブロックの使用 (または単にグローバル デストラクタに依存する) は、ZMQ のスレッドの内部使用によって何らかの形で妨げられる可能性があり、シグナル処理を Net::Server フレームワークに任せるのが最も賢明だと思います。

于 2013-01-24T15:11:37.630 に答える