2012-04-02 8 views
0

Ich konvertiere ein interaktives Befehlszeilentool in eine Webanwendung mit dem Tool als Backend. Ich nehme Benutzerbefehle (unter Verwendung von AJAX) auf und rufe ein Perl-CGI-Skript auf, das den Befehl extrahiert. Ich verwende dann erwarten, den Befehl an den Prozess zu senden, sammeln Sie die Ausgabe und übergeben Sie das an die resultierende HTML-Seite.Perl Expect mit FreezeThaw

Der erste Befehl, den der Benutzer eingibt, wird ausgeführt. Die nächsten Befehle werden nicht ausgeführt.

Ich verwende FreezeThaw, um das Expect-Objekt nach der ersten Anforderung einzufrieren und es dann für die folgenden Anforderungen aufzutauen. Es gefriert gut, taut aber nicht auf.

Hier ist mein Code:

use strict; 
use warnings; 
use CGI; 
use Expect; 
use FreezeThaw qw(freeze thaw); 

if (-e "logFile") { 
    ##Log file exists, just run the command after retrieving the object 
    ##Retrieve object here 
    my ($expectObject) = thaw($params{'object'}); 

    if ($command eq 'exit') { 

     #exit 
    } 
} 
else { 
    print "log NOT exists!!"; 
    ##Log file doesn't exist, spawn a new process and loop 
    my $expectObject = Expect->spawn("command") || die "\nCannot spawn: $!\n"; 
    $expectObject->expect(15, "prompt>"); 
    $expectObject->send("$command\r"); 
    $expectObject->expect(15, "stile>"); 
    $output = $expectObject->before(); 
    print "<br>$output<br>"; 

    ##Persist object here in file 
    my $serialized = freeze($expectObject); 
    ##Write serialized object to file 
    die "Serialization Error (write):\n$!" if (!addParameter("$workingDir/$folderName", "object", $serialized)); 
} 

Irgendwelche Ideen, warum versagt es ..?

+0

Und kann mir jemand bitte sagen, wenn mein CGI-Skript endet, tötet es auch den erzeugten Prozess ..? Wenn ja, wie kann ich den erzeugten Prozess über Anfragen hinaus aufrechterhalten? – krish7919

Antwort

1

Wenn ein Perl-CGI-Programm endet, wird es alle erzeugten Prozesse zerstören, wenn sie sich nicht selbst dämonisieren.

Verwenden Sie mod_perl oder einen anderen persistenten Mechanismus, um eine Shell/einen Befehl zu öffnen oder alle Befehle nacheinander auszuführen.

+0

Nun, zumindest hoffen Sie, dass es alle erzeugten Prozesse aufräumt :) –

+0

Ich habe ein wenig über mod_perl gelesen. Kannst du mir bitte ein Beispiel geben oder mich zu einer exzellenten Tutorialseite führen? Die Apache-Site erwähnt viele Features, aber ich kann keine Beispiele finden. Danken! Und @ user1126070, kannst du mir bitte Ideen über andere persistente Mechanismen geben? – krish7919

+0

Warum brauchen Sie überhaupt Persistenz? – user1126070