Я использую Net :: Server :: Prefork для запуска TCP-сервера. Процедура запуска выглядит следующим образом:Perl Net :: Горячее развертывание сервера
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,
);
грузоотправитель использует эту функцию для обработки запросов:
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);
};
};
Теперь это все хорошо. Однако при обновлении сервера у меня в настоящее время возникает проблема: чтобы не убивать запросы, которые находятся в процессе обработки, я должен проверить активные процессы и подождать, пока они не будут завершены с дополнительной проблемой, которая при ожидании новых клиентов может подключиться. Итак, есть ли возможность «поэтапного отказа» от выполняемых дочерних процессов, т. Е. Прекратить простаивающие процессы, заменить их новой версией и заменить каждый запущенный (старый) процесс новой версией после завершения старого процесса?
В качестве альтернативы, можно ли блокировать входящие соединения, пока все старые дочерние процессы не будут завершены, а затем перезагрузите сервер в целом? Я думал об этом с временными правилами брандмауэра, но мне бы очень хотелось, чтобы Perl справился с этим.
Любые идеи оцениваются!
Нет. Правда, я пропустил это, так что спасибо за указав его. Я попробую это решение и вернусь, как только это сработает – Marcus
Я добавил 'leave_children_open_on_hup' в конфигурацию, и это в основном делает трюк. Однако поступающие запросы останавливаются. strace показывает, что они застревают в считывающем самолете. Во всяком случае, я принял ваше решение, но я остался с некоторым рытьем о том, почему время прочтения. – Marcus