about summary refs log tree commit homepage
path: root/lib/PublicInbox/Daemon.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2016-07-29 18:58:51 +0000
committerEric Wong <e@80x24.org>2016-07-29 19:17:04 +0000
commit87b61d1daa05bdcf9d810d1655e5abb45456e9a5 (patch)
treec461cc63d9886cc5066efd053a2b32b3fda21cae /lib/PublicInbox/Daemon.pm
parent204f8891f47b172c9880916993c18e6b041f4b88 (diff)
downloadpublic-inbox-87b61d1daa05bdcf9d810d1655e5abb45456e9a5.tar.gz
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")
Diffstat (limited to 'lib/PublicInbox/Daemon.pm')
-rw-r--r--lib/PublicInbox/Daemon.pm9
1 files changed, 5 insertions, 4 deletions
diff --git a/lib/PublicInbox/Daemon.pm b/lib/PublicInbox/Daemon.pm
index 7849f9c0..9125584b 100644
--- a/lib/PublicInbox/Daemon.pm
+++ b/lib/PublicInbox/Daemon.pm
@@ -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;