]> Sergey Matveev's repositories - public-inbox.git/commitdiff
daemon: re-enable SIGWINCH without setsid
authorEric Wong <e@80x24.org>
Fri, 29 Jul 2016 18:58:51 +0000 (18:58 +0000)
committerEric Wong <e@80x24.org>
Fri, 29 Jul 2016 19:17:04 +0000 (19:17 +0000)
This allows systemd users to use SIGWINCH to temporarily
(and gracefully) stop an instance of a service without
doing a code reload to bring it back up:

# start temporary new service code
systemctl start public-inbox-nntpd@2.service

# momentarily paralyze original service
systemctl kill -s WINCH public-inbox-nntpd@1.service

if new_code_at_2_sucks
then
# restart original workers
systemctl kill -s HUP public-inbox-nntpd@1.service
else # new is better than old, replace original instance
systemctl restart public-inbox-nntpd@1.service
fi

# cleanup the temporary service
systemctl stop public-inbox-nntpd@2.service

This partially reverts commit 73d274e83b7d300f31e0cc1ceeacbf73c6c2a1e4
("daemon: disable SIGWINCH unless explicitly daemonized")

lib/PublicInbox/Daemon.pm

index 7849f9c0aecd4fa581bcbdcb4c6fe9fa40caad19..9125584b3b12b334a078eb1c9aec1ff4aa5f27af 100644 (file)
@@ -112,7 +112,6 @@ sub daemonize () {
        check_absolute('pid-file', $pid_file);
 
        chdir '/' or die "chdir failed: $!";
-       open(STDIN, '+<', '/dev/null') or die "redirect stdin failed: $!";
 
        return unless (defined $pid_file || defined $group || defined $user
                        || $daemonize);
@@ -145,6 +144,8 @@ sub daemonize () {
                die "could not fork: $!\n" unless defined $pid;
                exit if $pid;
 
+               open(STDIN, '+<', '/dev/null') or
+                                       die "redirect stdin failed: $!\n";
                open STDOUT, '>&STDIN' or die "redirect stdout failed: $!\n";
                open STDERR, '>&STDIN' or die "redirect stderr failed: $!\n";
                POSIX::setsid();
@@ -376,12 +377,12 @@ sub master_loop {
                                exit if $quit++;
                                kill_workers($s);
                        } elsif ($s eq 'WINCH') {
-                               if ($daemonize) {
-                                       $worker_processes = 0;
-                               } else {
+                               if (-t STDIN || -t STDOUT || -t STDERR) {
                                        warn
 "ignoring SIGWINCH since we are not daemonized\n";
                                        $SIG{WINCH} = 'IGNORE';
+                               } else {
+                                       $worker_processes = 0;
                                }
                        } elsif ($s eq 'HUP') {
                                $worker_processes = $set_workers;