in reply to Re: Using SIGHUP to restart a daemon
in thread Using SIGHUP to restart a daemon

If you follow the link in the original post, it takes you to perlipc doc containing code that illustrates the problem.

Replies are listed 'Best First'.
Re^3: Using SIGHUP to restart a daemon
by vsespb (Chaplain) on Oct 17, 2013 at 17:17 UTC
    Looks like it's known problem in perl.
    Also, similar issue Can't catch signals after an exec?

    Code can be simplified to
    $sub = sub { exec "perl $0" }; $SIG{INT} = $sub; $SIG{USR1} = $sub; while(1) { print ++$counter, "\n"; sleep 1; }
    (if you press Ctrl-C, it restarts only once)
    Workaround for example in perldoc:
    #!/usr/bin/env perl use POSIX (); use FindBin (); use File::Basename (); use File::Spec::Functions; $| = 1; # make the daemon cross-platform, so exec always calls the script # itself with the right path, no matter how the script was invoked +. print STDERR "STARTED\n"; my $script = File::Basename::basename($0); my $SELF = catfile($FindBin::Bin, $script); # POSIX unmasks the sigprocmask properly my $need_restart = 0; $SIG{HUP} = sub { print "got SIGHUP\n"; $need_restart = 1; }; code(); sub code { print "PID: $$\n"; print "ARGV: @ARGV\n"; my $count = 0; while (++$count) { sleep 2; if ($need_restart) { exec($SELF, @ARGV) || die "$0: couldn't restart: $!"; } print "$count\n"; } }

    (i.e. need to call exec() outside of signal handler)

    And another workaround is posted above by McA Re: Using SIGHUP to restart a daemon