Показанный код не имеет отношения к самому Net::Server
, т.е. его ::PreForkSimple
расширение; сам сервер должен быть закрыт, если программа завершается сигналом. Мы не видим код вызова и то, как вы " закрыли службу ", кроме как по упомянутому сигналу.
Для этого есть server_close
метод в Net::Server
. Но метод с тем же именем, к которому относится вопрос, похоже, используется в вашем классе Listener
, который, таким образом, переопределяет метод (большого) родителя. Он только останавливает дальнейшую работу в дочерних процессах и не затрагивает сервер.
Так что, если это метод, вызываемый в обработчике сигналов, сервер никогда не отключается должным образом, и его существующие дочерние элементы остаются рядом. Вам необходимо вызвать server_close
для объекта Net::Server
или организовать собственный метод server_close
для вызова родительского метода.
Документация Net::Server
по Поток процесса объясняет
Во время фазы отключения сервера ($self->server_close
) поток программы представляет собой следующее:
$self->close_children; # if any
$self->post_child_cleanup_hook;
if (Restarting server) {
$self->restart_close_hook();
$self->hup_server;
}
$self->shutdown_sockets;
$self->server_exit;
Если вызов по server_close
для объекта Net::Server
или для родительского объекта вашего Listener
по какой-то причине не делает этого, попробуйте использовать отдельные методы, перечисленные в рабочем процессе.
Есть также сигналы, перечисленные в
Net :: Server :: PreForkSimple"личность" в Завершение работы
Каждый из сотрудников Fork и PreFork поддерживает постепенное отключение с помощью сигнала QUIT. Когда получено сообщение QUIT, родитель подает сигнал детям и затем ждет их выхода.
и затем под Hot Deploy
Начиная с версии 2.000, сервер PreForkSimple принимает сигналы TTIN и TTOU. Когда получен TTIN, max_servers увеличивается на 1. Если получен сигнал TTOU, max_servers уменьшается на 1
Но я надеюсь, что это не нужно для его выключения, и уж точно не последнее.