Pregunta

Quiero configurar una tubería de procesos desde Perl (que se ejecuta en Linux), que consta de dos partes que se ejecutan en momentos diferentes.

Por ejemplo:

Iniciar el proceso del consumidor:

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

luego mucho más tarde inicie el proceso de producción:

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

pero luego, de alguna manera, redirige la salida de gpg a la entrada a tar.

Puedo hacer esto construyendo un bucle:

while (<IN> ) {
  print OUT;
}

Pero me gustaría saber si de alguna manera puedo unir los dos procesos con la redirección.

¿Fue útil?

Solución

Añadir

pipe( IN, OUT );

Antes de las dos declaraciones abiertas. ¡Eso es!

Si quieres hacer algo más complicado, recomendaría el módulo IPC :: Run CPAN:

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

Le permite iniciar procesos, unir sus entradas y salidas, y agregar el registro o la redirección en cualquier punto de la cadena.

Otros consejos

Si los dos procesos no están relacionados, use un FIFO.

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

Esto crea un FIFO en $ ruta. Ahora tenga un proceso de escritura en ese archivo y el otro proceso lea de él.

Me gusta Proc :: SafeExec que te permite vincular procesos y archivos Se maneja de manera casi arbitraria con facilidad. Aquí hay un ejemplo:

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();

Después de ver IPC :: Run, parece mucho más simple ... aquí está el mismo ejemplo usando IPC :: Run en su lugar:

use IPC::Run qw(run);

run [qw(ls -l)], "|", [qw(sed -e s/a/b/)], ">", "tmp.txt";
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top