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")
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);
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();
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;