[pve-devel] [PATCH common 2/2] run_fork_with_timeout: handle SIGTERM
Dominik Csapak
d.csapak at proxmox.com
Tue Aug 21 15:07:25 CEST 2018
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 <d.csapak at proxmox.com>
---
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.11.0
More information about the pve-devel
mailing list