From 2e353dfb5f734b14e4cda874ac796722d4bf0032 Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Tue, 21 Aug 2018 15:07:25 +0200 Subject: [PATCH] run_fork_with_timeout: handle SIGTERM when stopping a worker while doing a run_fork_with_timeout, we want to handle that there and send the child the SIGTERM so that it can clean up for this we have to use readline_nointr, because the read from the pipe gets interrupted by the signal this partially fixes #1874 as we now correctly clean up the new disk, except if it is on lvm/lvmthin (possibly other storages as well), and use the old disk in the config Signed-off-by: Dominik Csapak --- src/PVE/Tools.pm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/PVE/Tools.pm b/src/PVE/Tools.pm index 4a8b5d9..06da78b 100644 --- a/src/PVE/Tools.pm +++ b/src/PVE/Tools.pm @@ -922,7 +922,6 @@ sub run_fork_with_timeout { # avoid leaving a zombie if the parent gets interrupted my $sig_received; - local $SIG{INT} = sub { $sig_received++; }; my $child = fork(); if (!defined($child)) { @@ -946,11 +945,17 @@ sub run_fork_with_timeout { POSIX::_exit(0); } + local $SIG{INT} = sub { $sig_received++; }; + local $SIG{TERM} = sub { + $error //= "interrupted by unexpected signal\n"; + kill('TERM', $child); + }; + $pipe_out->reader(); my $readvalues = sub { local $/ = undef; - my $child_res = decode_json(scalar<$pipe_out>); + my $child_res = decode_json(readline_nointr($pipe_out)); $res = $child_res->{result}; $error = $child_res->{error}; }; -- 2.39.2