2016-03-07 1 views
1

Этот код работает нормально, но я хочу достичь такой же цели, не используя IO :: Select - Я пробовал несколько вещей, но ничего не работает, поскольку я не очень хорошо знаком с perl.IPC :: open3 обработка ошибок без выбора

sub writeTologs 
{ 
my $cmd=shift; 

open(ERRLOG, '>>log//error.log') or die "Can't open error log! $!"; 
open(OUTPUT, '>>log//output.log') or die "Can't open output log! $!"; 

my ($infh,$outfh,$errfh); # these are the FHs for our child 
$errfh = gensym(); # we create a symbol for the errfh # because open3 will not do that for us 

my $pid; 
       # 
eval{ 
$pid = open3($infh, $outfh, $errfh, $cmd); 
}; 
die "open3: [email protected]\n" if [email protected]; 
       # 
print "PID was $pid\n"; 


my $sel = new IO::Select; # create a select object to notify 
         # us on reads on our FHs (File Handlers) 
$sel->add($outfh,$errfh); # add the FHs we're interested in 
         # 
    while(my @ready = $sel->can_read) { # read ready 
      foreach my $fh (@ready) { 
        my $line = <$fh>; # read one line from this fh 
        if(not defined $line){ # EOF on this FH 
        $sel->remove($fh); # remove it from the list 
        next;    # and go handle the next FH 
        } 

        if($fh == $outfh) {  # if we read from the outfh 
          print OUTPUT $line; # print it to OUTFH 
        } 
        elsif($fh == $errfh) {# do the same for errfh 
          print ERRLOG $line; 
          die "Error found : [email protected]"; 
          } 
          else { # we read from something else?!?! 
            die "Shouldn't be here\n"; 
          } 
        } 
    } 

close(ERRLOG) or die "Can't close filehandle! $!"; 
close(OUTPUT) or die "Can't close filehandle! $!"; 

} 

Я хочу умереть в своем процессе после написания в ERRLOG.

Я попытался ниже code-

open(ERRLOG, '>>log//error.log') or die "Can't open error log! $!"; 
open(OUTPUT, '>>log//output.log') or die "Can't open output log! $!"; 

my ($infh,$outfh,$errfh); # these are the FHs for our child 
$errfh = gensym(); # we create a symbol for the errfh # because open3 will not do that for us 

my $pid; 
my $line="";     # 
eval{ 
$pid=open3($infh, $outfh, $errfh, $cmd1); 
}; 
die "open3: [email protected]\n" if [email protected]; 

if (defined(<$errfh>)) { 
     print "Error start ".<$errfh>; 
     $errfh->close; 
     while($line = <$errfh>) { 
       print $line; 
       print "Inside while"; 
     } 

     print "Error deifned \n"; 
} else { 

     while ($line=<$outfh>) { 
       print OUTPUT $line; 
     } 
     print "Output log"; 
} 

Но пока цикл не получает выполняется внутри, если условия.

+0

Обратите внимание, что в общем, нет никакого способа, чтобы читать как стандартный вывод и стандартный поток ошибок без использования выбора или риска в тупик. – nwellnhof

+0

Есть ли другой способ добиться такого же результата, я проверял IPC: Run. –

+0

Да, вы можете использовать IPC :: Run (и, возможно, более простой IPC :: Run3), если это можно сделать с помощью open3 и выбрать. – ikegami

ответ

1

я смог добиться этого из-под кодом -

sub writeTologs { 
my $cmd  = shift; 
my $strout = "$LOGDIR/$STDLOG"; 
my $strerr = "$LOGDIR/$ERRORLOG"; 
my $flag  = 0; 
my $line  = ''; 
my $pid; 

open(ERRLOG , '>>', $strerr ) or die "Can't open error log! $!"; 
open(SCHDLOG , '>>', $strout ) or die "Can't open output log! $!"; 

my ($infh,$outfh,$errfh); 
$errfh = gensym(); 

eval 
{ 
    $pid = open3($infh, $outfh, $errfh, $cmd); 
}; 
die "Open faile : [email protected]" if [email protected]; 

my $line_err = <$errfh>; 

if (defined(<$outfh>)) 
{ 
    while($line = <$outfh>) 
    { 
      print SCHDLOG '[' . get_timestamp() . "]: $line"; 
    } 
} 

if ($line_err) 
{ 
    print ERRLOG $line_err; 
    $flag =1 ; 
} 

print "PID = $pid"; 

waitpid($pid,0); 

close(ERRLOG) or die "Can't close filehandle! $!"; 
close(SCHDLOG) or die "Can't close filehandle! $!"; 
return $flag; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^