2016-06-24 9 views
0

Ich rufe ein Perl-Skript von einem anderen mit System(), ich möchte diese Skripte eine Kommunikation (Handshake Art von Mechanismus) wo ich basierend auf der Ausgabe von einem Skript kann ich weiter Verarbeitung in einem anderen.Perl: Handshake-Mechanismus unter Perl-Skripten

bitte einen Blick auf diese:

können sagen, dass ich in main.pl bin

1 #!/usr/bin/perl 
    2 
    3 use strict; 
    4 use warnings; 
    5 use Net::OpenSSH; 
    6 
    7 #check for if the socket is established 
    8 #call the client (host) script 
    9 my $pwd = $ENV{'PWD'}; 
    10 my $rc = system("$pwd/utpsm_run_automation/utpsm_lts_client.pl")         
    11   or die "cant run client.pl $! \n"; 

in dem obigen Skript, das ich nennen werde, will ich sehen, wenn die Verbindung zum Server hergestellt wird , also einige Handshake-Mechanismen, die ich brauche, im Grunde für die weitere Verarbeitung in main.pl, muss ich wissen, was der Status des obigen Skriptes war, nachdem es ausgeführt wurde. bin ich jetzt klar?

hier ist client.pl

1 #!/usr/bin/perl 
2 use strict; 
3 use warnings; 
4 use IO::Socket::INET; 
5 use Net::OpenSSH; 
6 #auto-flush on socket 
7 $| = 1; 
8 
9 #create a connecting socket 
10 my $socket = new IO::Socket::INET (
11   PeerHost => 'ltsbm.aus.XX.XX', 
12   PeerPort => 7777, 
13   Proto => 'tcp', 
14   ); 
15 die "cannot connect to the server$! \n" unless  $socket;           
16 print "VIRU ::connected to the server \n"; 
17 
18 #data to send to the server 
19 my $req = 'VIRU :: Sending data \n'; 
20 sleep(20); 
21 my $size = $socket->send($req); 
22 
23 #sending file over socket using scp 

Diese client.pl ist

+1

Ihre Frage ist vage. Könnten Sie ein konkreteres Beispiel dafür liefern, was Sie erreichen möchten? – xxfelixxx

+0

Möchten Sie nur wissen, ob der Systembefehl fehlgeschlagen ist, oder möchten Sie die Ausgabe? – xxfelixxx

+0

Sie können das '(system ($ cmd) == 0) oder sterben" Kann nicht ausführen $ cmd ': $! ";' Construct – xxfelixxx

Antwort

1

ich mit früheren commen darüber einig, dass die allgemeine Idee in erster Linie nicht sehr gut ist. Wer diese Architekturanforderung hat, kennt wahrscheinlich ein bisschen Shell-Skripting, aber nicht Perl.

Das heißt, wenn Sie sicher sind, dass Ihre Ausgabe nicht sehr lang ist und es ist in Ordnung, es nur zu verarbeiten, wenn der Kindprozess abgeschlossen ist, @xxfelixxx die Idee der Verwendung von qx// ist definitiv die einfachste. Wenn Sie eine Ausgabe verarbeiten mögen, während das Kind noch läuft und/oder der Ausgang kann so groß sein, dass es besser ist, es Zeile für Zeile zu verarbeiten, können Sie leicht ein Rohr in einem open() Anruf ein:

open my $pipe, '-|', $program_name or die "Could not run $program_name: $!'; while(<$pipe>) { ... # read process output } Viel einfacher und weniger fehleranfällig als das Einrichten einer Named Pipe und ein fork()/exec() Tanz für einfache Aufgaben wie diese tun.

+0

(1) Wenn Sie sagen, dass "die allgemeine Idee nicht sehr gut ist", wäre es gut zu erklären, warum Sie das denken. Die "_previous Kommentatoren_" tat auch nicht. (2) Durch Ihren Kommentar von 'qx' folgt, dass Sie das' open' als eine Lösung anbieten, wenn das Kind lange läuft. Aber wenn der Elternteil zuerst diesen "_easier und weniger fehleranfälligen_" Code verlässt, den Sie zeigen, stürzt das Kind auf seinem ersten folgenden Druck zu STDOUT, über SIGPIPE und ohne ein Wort ab. Ja, 'offen' ist sauberer, aber das verbirgt auch die Komplexität - es entfernt sie nicht. Bitte vervollständige deine Lösung, dies ist gefährlich irreführend. – zdim

+0

Btw, die OP scheint nach einem bloßen "_handshake_" zu fragen, und dann geht jeder für sich. Ihre Antwort sieht das nicht vor. – zdim

+0

@zdim, Ausführen von externen Skripten für triviale Dinge, die genauso gut in einem Modul leben könnten, ist unnötig begrenzt in Bezug auf nicht-skalare Daten, fehleranfällig (denken zitiert) und langsam. Das übergeordnete Element in meinem Beispiel kann nicht zuerst beendet werden, da die Schleife erst dann beendet wird, wenn das untergeordnete Element die Standardausgabe geschlossen hat, normalerweise durch Beenden. Natürlich kann man aus der Schleife ausbrechen und das Kind trotzdem töten, aber das manuelle Abzweigen behebt das in keiner Weise. – mbethke

0

Ich nehme an, Sie haben bereits eine Liste möglicher Ergebnisse von client.pl. Erstellen Sie eine Return-Code-Tabelle für jeden möglichen Ausgang des Client-Skript für Ihre Referenz, zum Beispiel:

0 = success connecting to server 
1 = unable to ping remote server 
2 = socket error 

An dem Punkt, bevor die Client-Skript beendet es mit einem Rückgabecode Ausgang hat. Beispiel:

exit 1; 

haben nun das Hauptskript den Return-Code & Parse es durch eine if-Anweisung zu fangen. Das Hauptskript kann basierend auf dem Rückgabecode des Clientskripts Maßnahmen ergreifen.

Verwandte Themen