diff options
author | Eric Wong <e@80x24.org> | 2016-07-29 18:58:51 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2016-07-29 19:17:04 +0000 |
commit | 87b61d1daa05bdcf9d810d1655e5abb45456e9a5 (patch) | |
tree | c461cc63d9886cc5066efd053a2b32b3fda21cae /lib/PublicInbox/Daemon.pm | |
parent | 204f8891f47b172c9880916993c18e6b041f4b88 (diff) | |
download | public-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.pm | 9 |
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; |