Perl Expect与冻结解冻

Perl Expect与冻结解冻,perl,expect,object-serialization,freeze-thaw,Perl,Expect,Object Serialization,Freeze Thaw,我正在将一个交互式命令行工具转换为一个web应用程序,该工具作为后端。 我接受用户命令(使用AJAX)并调用一个perl CGI脚本来提取命令。 然后,我使用expect将命令发送到进程,收集输出并将其传递到生成的html页面 用户输入的第一个命令执行良好。 下一个命令不会执行 在第一个请求之后,我使用冻结解冻来冻结expect对象,然后为下面的请求解冻它。它冻得很好,但不融化 这是我的密码: use strict; use warnings; use CGI; use Expect; use

我正在将一个交互式命令行工具转换为一个web应用程序,该工具作为后端。 我接受用户命令(使用AJAX)并调用一个perl CGI脚本来提取命令。 然后,我使用expect将命令发送到进程,收集输出并将其传递到生成的html页面

用户输入的第一个命令执行良好。 下一个命令不会执行

在第一个请求之后,我使用冻结解冻来冻结expect对象,然后为下面的请求解冻它。它冻得很好,但不融化

这是我的密码:

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 ) );
}
使用严格;
使用警告;
使用CGI;
使用Expect;
使用冻融qw(冻融);
如果(-e“日志文件”){
##日志文件已存在,请在检索对象后运行命令
##在这里检索对象
my($expectObject)=解冻($params{'object'});
if($command eq'exit'){
#出口
}
}
否则{
打印“日志不存在!!”;
##日志文件不存在,生成新进程和循环
我的$expectObject=Expect->spawn(“命令”)| | die“\n无法生成:$!\n”;
$expectObject->expect(15,“提示>”);
$expectObject->send($command\r”);
$expectObject->expect(15,“stile>”);
$output=$expectObject->before();
打印“
$output
”; ##将对象持久化到文件中 my$serialized=冻结($expectObject); ##将序列化对象写入文件 die“序列化错误(写入):\n$!”如果(!addParameter(“$workingDir/$folderName”,“object”,$serialized)); }

你知道它为什么会失败吗?

如果一个Perl CGI程序结束,如果它们不将自己后台化,它将破坏所有生成的进程


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

有人能告诉我,如果我的CGI脚本结束,它是否也会杀死生成的进程。。?如果是,我如何使派生进程在请求之间持久化呢?好吧,至少你希望它能清理所有派生进程:)我确实读了一些关于mod_perl的书。你能给我举个例子或者引导我去一个优秀的教程网站吗。。?apache站点提到了很多特性,但我找不到示例。感谢还有@user1126070,你能给我一些关于其他持久性机制的想法吗?你为什么需要持久性呢?