Frage

Ich will eine Pipeline von Prozessen aus Perl einzurichten (unter Linux), bestehend aus zwei Teilen zu unterschiedlichen Zeiten ausgeführt werden.

Beispiel:

Starten Sie den Verbraucher Prozess:

open( OUT, "| tar xvf - " ) || die "Failed: tar: $!";

starten Sie dann viel später den Hersteller Prozess:

open( IN, "gpg -d $file |" ) || die "Failed: gpg: $!";

aber dann umleiten irgendwie die Ausgabe von GPG in den Eingang zu tar.

Ich kann dies tun, indem eine Schleife Aufbau:

while (<IN> ) {
  print OUT;
}

Aber ich möchte wissen, ob ich irgendwie die beiden Prozesse zusammen mit Umleitung kleben kann.

War es hilfreich?

Lösung

Hinzufügen

pipe( IN, OUT );

Vor den beiden offenen Aussagen. Das ist es!

Wenn Sie etwas komplizierter machen wollen, würde ich die IPC :: Run CPAN Modul empfehlen:

http://search.cpan.org/dist/IPC-Run/

Damit können Sie beginnen Prozesse, deren Eingang binden und gibt zusammen, und an einer beliebigen Stelle in der Kette Protokollierung oder Umleitung hinzuzufügen.

Andere Tipps

Wenn die beiden Prozesse völlig unabhängig sind, einen FIFO verwendet werden.

use POSIX qw(mkfifo);
mkfifo($path, 0700) or die "mkfifo $path failed: $!";

Dies erzeugt einen FIFO bei $ Pfad. Jetzt hat einen Prozess Schreib auf diese Datei, und den anderen Prozess von ihnen lesen.

Ich mag Proc :: SafeExec können Sie damit zusammenbinden Prozesse und Datei leicht Griffe in nahezu beliebiger Weise. Hier ein Beispiel:

use strict;
use warnings;

use Proc::SafeExec;

open(my $ls, "-|", "ls", "-l") or die "Err: $!";
open(my $fh, ">", "tmp.txt") or die "Err: $!";

my $p = Proc::SafeExec->new({
  exec => [qw(sed -e s/a/b/)],
  stdin => $ls,
  stdout => $fh,
});
$p->wait();

auf dem IPC :: Run Nach einem Blick, es viel einfacher aussieht ... hier ist das gleiche Beispiel IPC :: Run statt:

use IPC::Run qw(run);

run [qw(ls -l)], "|", [qw(sed -e s/a/b/)], ">", "tmp.txt";
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top