gpt4 book ai didi

Perl Net::Server 热部署

转载 作者:可可西里 更新时间:2023-11-01 02:42:40 33 4
gpt4 key购买 nike

我正在使用 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);
};
};

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

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

欢迎任何想法!

最佳答案

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

Net::Server Restarting

关于Perl Net::Server 热部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28581589/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com