Thread System-Ausgabe in Datei umleiten - inkl. ReturnCode-Steuerung
(23 answers)
Opened by Duhmok at 2012-02-20 15:54
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 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.
|