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 またはその他の永続的なメカニズムを使用して、「シェル/コマンド」を開いたままにするか、すべてのコマンドを 1 つずつ実行します。

于 2012-04-02T13:07:48.010 に答える