Hallo,
ich mochte zwischen 2 Perlscripts auf verschiedenen Rechnern verschlüsselt und komprimiert Daten und Dateien austauschen. Folgendes Minimalbeispiel soll das problem verdetlichen:
server1.pl [wird gestartet]
#!/usr/bin/perl -w
use strict;
use warnings;
use IPC::Open2;
#use diagnostics;
open2(my $pipei, my $pipeo, 'ssh', '172.20.200.21', "/root/server2.pl");
print STDERR "server 1: sending data: 1\n";
print $pipeo "1\n" or die("Cannot send data: 1 $!");
print STDERR "server 1: receiving...\n";
my $data = <$pipei>;
print STDERR "server 1: received ".$data."\n";
print STDERR "server 1: sending data: 3\n";
print $pipeo "3\n" or die("Cannot send data: 3 $!");
print STDERR "server 1: receiving...\n";
$data = <$pipei>;
print STDERR "server 1: received ".$data."\n";
close $pipei;
close $pipeo;
server2.pl [auf anderem Rechner]
#!/usr/bin/perl -w
use strict;
use warnings;
use IPC::Open2;
#use diagnostics;
print STDERR "server 2: receiving...\n";
my $data = <STDIN>;
print STDERR "server 2: received: ".$data."\n";
print STDERR "server 2: sending data: 2\n";
print STDOUT "2\n" or die("Cannot send data: 2 $!");
print STDERR "server 2: receiving...\n";
$data = <STDIN>;
print STDERR "server 2: received: ".$data."\n";
print STDERR "server 2: sending data: 4\n";
print STDOUT "4\n" or die("Cannot send data: 4 $!");
Das Beispiel liefert folgende Ausgabe:
linux:~ # ./server1.pl
server 1: sending data: 1
server 1: receiving...
root@172.20.200.21's password:
server 2: receiving...
server 2: received: 1
server 2: sending data: 2
server 2: receiving...
Danach passiert nichts mehr, manchmal bleibt nur ein zombieprozess übrlig.
Der Child-Prozess bekommt die Daten ordnungsgemäß, aber danach wartet der parent-Prozess immer erst auf die Beendigung des Childprozesses.
Was kann ich tun, damit die Daten sofort ankommen bzw. nicht immer einen neuen Prozess öffnen muss?
Vielen Dank,
Holger