Ich habe ein paar Bash-Skripts, die ich laufe, aber sie können mehrere Stunden dauern, bis sie fertig sind, während der sie Download-Geschwindigkeiten, ETAs und ähnliche Informationen ausspucken. Ich muss diese Informationen in Perl erfassen, aber ich stoße auf ein Problem, ich kann die Ausgabe Zeile für Zeile nicht lesen (es sei denn, ich verpasse etwas).Wie kann ich die Ausgabe von externen Befehlen in Echtzeit in Perl lesen?
Haben Sie Hilfe dabei?
EDIT: um dies ein wenig besser zu erklären Ich bin mehrere Bash-Skripte nebeneinander laufen, möchte ich gtk mit Perl verwenden, um handliche Fortschrittsbalken zu erzeugen. Momentan laufe ich zwei Threads für jedes Bash-Skript, das ich ausführen möchte, einen Master-Thread für die Aktualisierung der grafischen Informationen. Es sieht in etwa so aus (so weit wie möglich):
my $command1 = threads->create(\&runCmd, './bash1', \@out1);
my $controll1 = threads->create(\&monitor, $command1, \@out1);
my $command1 = threads->create(\&runCmd, 'bash2', \@out2);
my $controll2 = threads->create(\&monitor, $command2, \@out2);
sub runCmd{
my $cmd = shift;
my @bso = shift;
@bso = `$cmd`
}
sub monitor{
my $thrd = shift;
my @bso = shift;
my $line;
while($thrd->is_running()){
while($line = shift(@bso)){
## I check the line and do things with it here
}
## update anything the script doesn't tell me here.
sleep 1;# don't cripple the system polling data.
}
## thread quit, so we remove the status bar and check if another script is in the queue, I'm omitting this here.
}
Sie sollten wirklich eine richtige Ereignisschleife, wie POE anstelle von Threads verwenden. Mit POE :: Wheel :: Run werden Sie viel besseren Erfolg haben als Ihre eigene handgerollte Fast-Event-Schleife. (Ich würde AnyEvent :: Subprocessor empfehlen, aber es wird ein größeres Refactoring unterzogen und wird Ihr Problem nicht sofort lösen.) – jrockway