From 0f58c306032d3daa23a5f3dc471b73a0f62e2ed3 Mon Sep 17 00:00:00 2001 From: eleksir Date: Sat, 1 Jan 2022 17:34:07 +0300 Subject: [PATCH] Implement async signal trap via Mojo::IOLoop::Signal for more robust app stop and restart --- lib/Craniac.pm | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/Craniac.pm b/lib/Craniac.pm index 2f2b0f8..aaaff97 100644 --- a/lib/Craniac.pm +++ b/lib/Craniac.pm @@ -20,6 +20,7 @@ use English qw ( -no_match_vars ); use Digest::SHA qw (sha1_base64); use Hailo; use Mojo::IOLoop; +use Mojo::IOLoop::Signal; use Mojo::Log; # Чтобы "уж точно" использовать hiredis-биндинги, загрузим этот модуль перед Mojo::Redis use Protocol::Redis::XS; @@ -351,6 +352,18 @@ my $parse_message = sub { return; }; +my $__signal_handler = sub { + my ($self, $name) = @_; + $log->info ("[INFO] Caught a signal $name"); + + if (defined $main::pidfile && -f $main::pidfile) { + unlink $main::pidfile; + } + + exit 0; +}; + + # Main loop, он же event loop sub RunCraniac () { $log->info ("[INFO] Connecting to $c->{server}, $c->{port}"); @@ -392,6 +405,11 @@ sub RunCraniac () { ); } + Mojo::IOLoop::Signal->on ( + TERM => $__signal_handler, + INT => $__signal_handler + ); + do { Mojo::IOLoop->start } until Mojo::IOLoop->is_running; return; }