]> git.proxmox.com Git - pve-common.git/blobdiff - src/PVE/RESTEnvironment.pm
foolowup: improve/add comments and spacing
[pve-common.git] / src / PVE / RESTEnvironment.pm
index 91de8750595a75042fe775f9168b5606cf88dbbd..6a53741242349610902093342c2e3b7e04b5d6a6 100644 (file)
@@ -270,7 +270,7 @@ sub active_workers  {
        }
 
 
-       @ta = sort { $b->{starttime} cmp $a->{starttime} } @ta;
+       @ta = sort { $b->{starttime} <=> $a->{starttime} } @ta;
 
        my $save = defined($new_upid);
 
@@ -494,10 +494,17 @@ sub fork_worker {
        $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;
@@ -525,7 +532,7 @@ sub fork_worker {
                    if !open(STDIN, "</dev/null");
 
                $outfh = PVE::Tools::upid_open($upid);
-               $resfh = $outfh;
+               $resfh = fileno($outfh);
            }
 
 
@@ -561,15 +568,17 @@ sub fork_worker {
        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;