Perl Net::Server 热部署

Perl Net::Server hot deployment

我正在使用 Net::Server::Prefork 启动 TCP 服务器。启动例程如下所示:

use 5.10.1;
use strict;
use warnings;
use parent 'Net::Server::Fork';

        Dispatcher->run(
            'host'            => $host                                   || '*',
            'port'            => $port                                   || 7000,
            'ipv'             => '*',
            'log_level'       => $main::config{'backend.loglevel'}       || 0,
            'log_file'        => $main::config{'backend.logfile'}        || undef,
            'pid_file'        => $main::config{'backend.pidfile'}        || undef,
            'user'            => $main::config{'backend.user'}           || 'nobody',
            'group'           => $main::config{'backend.group'}          || 'nogroup',
            'max_servers'     => $main::config{'backend.maxconnections'} || 3,
            'background'      => !$main::config{'backend.foreground'}    || undef,
            'allow'           => $main::config{'ip'}                     || '.*',
            'reverse_lookups' => 1,
        );

Dispatcher 使用此函数处理请求:

sub process_request {
    eval {
        local $SIG{'ALRM'} = sub { die "Timed Out!\n" };
        my $previous_alarm = alarm($timeout);
        my @args;
        {
            my $command =  <STDIN>;
            @args = split /\s+/, $command;
            alarm($timeout);
        }

        alarm(($main::config{'timeout'} + 5) || 185);
        {
            Dispatcher::main(@args);
        }
        alarm($previous_alarm);
    };
};

现在一切都很好。但是,在更新服务器时,我目前遇到的问题是,为了不终止正在处理的请求,我必须检查活动进程并等到它们完成,而在等待新客户端时会出现其他问题可以连接。 那么 - 是否有机会 'phase out' 运行 子进程,即终止空闲的预分叉进程,用新版本替换它们,并用新版本替换每个 运行 (旧)进程一旦旧流程完成?

或者,我可以阻止传入连接,直到所有旧的子进程完成,然后重新启动整个服务器吗?我正在考虑使用临时防火墙规则来执行此操作,但我真的更希望让 perl 处理它。

欢迎任何想法!

您是否尝试过使用 leave_children_open_on_hup 配置选项并使用 HUP 信号重新启动服务器? [linux/unix 的食谱]
它应该根据文档工作。

Net::Server Restarting