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 ..?
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