Thread System-Ausgabe in Datei umleiten - inkl. ReturnCode-Steuerung (23 answers)
Opened by Duhmok at 2012-02-20 15:54

murphy
 2012-02-22 15:31
#156329 #156329
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
In der Tat sollte das, was der externe Prozess auf seine Standardausgabe schreibt, in dem Array landen.

Wenn Du statt
Code (perl): (dl )
my @output = <$pipe>;

etwas wie
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
{
  open my $out, '>', '/was/auch/immer.out' or do {
    die "failed to open output file: $!";
  };
  while (my $line = <$pipe>) {
    print $out $line;
  }
  close $out or do {
    die "failed to close output file: $!";
  }
}

schreibst, sollte die Ausgabe in die Datei /was/auch/immer.out kopiert werden.

Wenn die Ausgabe im Endeffekt von dem Perlskript selbst verarbeitet werden soll, wäre es natürlich besser, das direkt zu tun und nicht den Umweg über eine Datei zu gehen.

Und wenn Du etwas komplizierteres brauchst, zum Beispiel mehrere Ausgabeumleitungen oder Timeouts für den externen Prozess, dann wird es leider recht unhandlich, das selber auszuprogrammieren.

Ich empfehle für nicht triviale Steuerung externer Prozesse das Modul CPAN:IPC::Run. Das könnte zum Beispiel so aussehen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use IPC::Run qw/run/;

eval {
  # Externen Prozess ausführen,
  # STDIN schließen, STDOUT und STDERR in /was/auch/immer.out umleiten
  run([ $impKorr, -cfgfile => $cfgfile, -dbuser => $USER, -dbpassword => $PWD ],
      '<&-', '>&', '/was/auch/immer.out');
  # Externer Prozess prinzipiell erfolgreich ausgeführt,
  # Rückgabewert überprüfen:
  my $rc = $?;
};
if ($@) {
  # Externer Prozess konnte nicht ausgeführt werden,
  # Fehler behandeln:
  warn $@;
}


Den eval-Block und die Abfrage von $@ kann man sich natürlich schenken, wenn das Skript ohnehin sterben soll, sofern sich der externe Prozess nicht ausführen lässt.
When C++ is your hammer, every problem looks like your thumb.

View full thread System-Ausgabe in Datei umleiten - inkl. ReturnCode-Steuerung