2012-04-02 11 views
0

私は対話型コマンドラインツールをWebアプリケーションに変換しています。このツールはバックエンドとして使用しています。 私は(AJAXを使って)ユーザーコマンドを受け取り、コマンドを抽出するperl CGIスクリプトを呼び出します。 次に、コマンドをプロセスに送信し、出力を収集し、結果のhtmlページに渡すためにexpectを使用します。Perl FreezeThawで期待する

ユーザーが入力する最初のコマンドは正常に実行されます。 次のコマンドは実行されません。

FreezeThawを使用して、最初のリクエストの後に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)); 
} 

任意のアイデアを、なぜそれが失敗していますか..?

+0

私のCGIスクリプトが終了した場合は、誰でもplsに教えてください。はいの場合、どのように生成されたプロセスを複数のリクエストにわたって持続させることができますか? – krish7919

答えて

1

Perl CGIプログラムが終了すると、生成されたすべてのプロセスがデーモン化されないと、そのプロセスはすべて破棄されます。

mod_perlまたは他の永続的なメカニズムを使用して、 'shell/command'を開いたままにするか、すべてのコマンドを1つずつ実行します。

+0

少なくとも、すべての生成されたプロセスをクリーンアップしたいと思っています:) –

+0

私はmod_perlについて少し読んだ。あなたは私に例を与えたり、素晴らしいチュートリアルのサイトに案内してくれますか? Apacheサイトには多くの機能がありますが、例は見つかりません。感謝!と@ user1126070、他の永続的なメカニズムについて私にアイデアを教えてもらえますか? – krish7919

+0

なぜあなたは永続性を必要としますか? – user1126070

関連する問題