}
- @ta = sort { $b->{starttime} cmp $a->{starttime} } @ta;
+ @ta = sort { $b->{starttime} <=> $a->{starttime} } @ta;
my $save = defined($new_upid);
$SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub { die "received interrupt\n"; };
$SIG{CHLD} = $SIG{PIPE} = 'DEFAULT';
-
- # set sess/process group - we want to be able to kill the
- # whole process group
- POSIX::setsid();
+ $SIG{TTOU} = 'IGNORE';
+
+ # set session/process group allows to kill the process group
+ if ($sync && -t STDIN) {
+ # some sync'ed workers operate on the tty but setsid sessions lose
+ # the tty, so just create a new pgroup and give it the tty
+ POSIX::setpgid(0, 0) or die "failed to setpgid: $!\n";
+ POSIX::tcsetpgrp(fileno(STDIN), $$) or die "failed to tcsetpgrp: $!\n";
+ } else {
+ POSIX::setsid();
+ }
POSIX::close ($psync[0]);
POSIX::close ($ctrlfd[0]) if $sync;
if !open(STDIN, "</dev/null");
$outfh = PVE::Tools::upid_open($upid);
- $resfh = $outfh;
+ $resfh = fileno($outfh);
}
POSIX::write($psync[1], $upid, length ($upid));
POSIX::close($psync[1]) if !$sync; # don't need output pipe if async
- my $readbuf = '';
- # sync with parent (wait until parent is ready)
- POSIX::read($csync[0], $readbuf, 4096);
- die "parent setup error\n" if $readbuf ne 'OK';
+ eval {
+ my $readbuf = '';
+ # sync with parent (wait until parent is ready)
+ POSIX::read($csync[0], $readbuf, 4096);
+ die "parent setup error\n" if $readbuf ne 'OK';
- if ($self->{type} eq 'ha') {
- print "task started by HA resource agent\n";
- }
- eval { &$function($upid); };
+ if ($self->{type} eq 'ha') {
+ print "task started by HA resource agent\n";
+ }
+ &$function($upid);
+ };
my $err = $@;
if ($err) {
chomp $err;