0

我正在将交互式命令行工具转换为 Web 应用程序,并使用该工具作为后端。我接受用户命令(使用 AJAX)并调用提取命令的 perl CGI 脚本。然后我使用 expect 将命令发送到进程,收集输出并将其传递给生成的 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 ) );
}

任何想法为什么它失败了..?

4

1 回答 1

1

如果 Perl CGI 程序结束,它会销毁所有生成的进程,如果它们不守护自己的话。

使用 mod_perl 或其他持久性机制来保持打开“shell/command”或一一执行所有命令。

于 2012-04-02T13:07:48.010 回答