+my $kill_process_group = sub {
+ my ($pid, $pstart) = @_;
+
+ # send kill to process group (negative pid)
+ my $kpid = -$pid;
+
+ # always send signal to all pgrp members
+ kill(15, $kpid); # send TERM signal
+
+ # give max 5 seconds to shut down
+ for (my $i = 0; $i < 5; $i++) {
+ return if !PVE::ProcFSTools::check_process_running($pid, $pstart);
+ sleep (1);
+ }
+
+ # to be sure
+ kill(9, $kpid);
+};
+
+sub check_worker {
+ my ($upid, $killit) = @_;
+
+ my $task = PVE::Tools::upid_decode($upid);
+
+ my $running = PVE::ProcFSTools::check_process_running($task->{pid}, $task->{pstart});
+
+ return 0 if !$running;
+
+ if ($killit) {
+ &$kill_process_group($task->{pid});
+ return 0;
+ }
+
+ return 1;
+}
+