Perl Expect с FreezeThaw - PullRequest
       24

Perl Expect с FreezeThaw

0 голосов
/ 02 апреля 2012

Я преобразую интерактивный инструмент командной строки в веб-приложение с инструментом в качестве внутреннего интерфейса.Я принимаю пользовательские команды (используя AJAX) и вызываю Perl CGI-скрипт, который извлекает команду.Затем я использую «Ожидаю», чтобы отправить команду процессу, собрать выходные данные и передать их на результирующую HTML-страницу.

Первая команда, которую пользовательский ввод выполняет нормально.Следующие команды не выполняются.

Я использую FreezeThaw, чтобы заморозить ожидаемый объект после первого запроса, а затем разморозить его для следующих запросов.Он хорошо замерзает, но не оттаивает.

Вот мой код:

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 ) );
}

Есть идеи, почему он не работает ..?

1 Ответ

1 голос
/ 02 апреля 2012

Если программа Perl CGI завершается, она уничтожит все порожденные процессы, если они не демонизируют себя.

Используйте mod_perl или другой постоянный механизм, чтобы оставить открытой «оболочку / команду» или выполнить все команды по однойодин.

...