1

(コンテキスト:Perl CGIスクリプトから長時間実行されるプロセスを監視しようとしています。MSSQLデータベースをバックアップしてから7-zipします。これまでのところ、バックアップ部分(を使用WITH STATS=1)はファイルに出力します。数秒ごとに更新して、ブラウザに確認してもらうと、機能します。)

7zipのコマンドラインユーティリティを使用しようとしていますが、プログレスバーをファイルにキャプチャします。残念ながら、SQLバックアップとは異なり、別のパーセントが実行されるたびに別の行が出力されますが、7zipは新しい進行状況データを出力する前に出力を巻き戻すため、コマンドラインで通常使用している場合は見栄えが良くなります。これが残念な理由は、、を使用した通常のリダイレクト>1>2>空白のファイルのみが作成され、ジョブが完了するまで出力がないを除いて、出力が表示されないためです>。これは、プログレスバーにはあまり役立ちません。 。

コマンドライントリック(Perlなし)を使用するか、Perlを使用して、%のすべての変更をログファイルに追加する(つまり、既存のログファイル監視方法を使用できる)ことで、この種の出力をキャプチャするにはどうすればよいですか?呼び出した直後にそれをキャプチャするコードsystem()

4

3 に答える 3

1

出力を一度にキャプチャする必要がある場合は、これが必要なコードです。

$var=`echo cmd`;

出力を1行ずつ読み取りたい場合は、次のコードが必要です。

#! perl -slw
use strict;
use threads qw[ yield async ];
use threads::shared;

my( $cmd, $file ) = @ARGV;
my $done : shared = 0;
my @lines : shared;

async {
    my $pid = open my $CMD, "$cmd |" or die "$cmd : $!";
    open my $fh, '>', $file or die "$file : $!";
    while( <$CMD> ) {
        chomp;
        print $fh $_;         ## output to the file
        push @lines, $_;    ## and push it to a shared array
    }
    $done = 1;
}->detach;

my $n = 0;
while( !$done ) {
    if( @lines ) {            ## lines to be processed
        print pop @lines;   ## process them
    }
    else {
        ## Else nothing to do but wait.
        yield;
    }
}

もう1つのオプションは、Windows作成プロセスを使用することです。Windows C / C ++の作成プロセスでは、すべてのstdoutをリダイレクトできることを知っています。Perlはこれと同じAPI呼び出しにアクセスできます。Win32::Processを参照してください。

于 2010-02-05T18:56:46.163 に答える
0

パイプを開いて7zipの出力を読み取ることができます。

于 2010-02-05T18:47:34.433 に答える
0

これは、巻き戻される出力をキャプチャする方法には答えませんが、私が使用することになったそれを実行するための便利な方法でした。

復元の場合:

  1. 7za lzipファイル内のファイルとそのサイズを一覧表示するために使用します
  2. フォーク7za e使用open my $command
  3. 出てくる各ファイルを追跡-s $filenameし、リストと比較します
  4. すべての出力ファイルがフルサイズになったら、完了です。

バックアップの場合:

  1. どこかに一意のディレクトリを作成する
  2. フォーク7za a -w
  3. .tmpdirでファイルを見つけます
  4. そのサイズを追跡する
  5. .tmpファイルが存在しなくなったら、完了です

復元の場合は、完了したパーセンテージを表示するのに十分なデータを取得しますが、バックアップの場合は、これまでの合計ファイルサイズしか表示できませんが、同様のデータを使用してゲストを取得している場合は、履歴比率と比較できます。それでも、以前よりも多くのフィードバックがあります(なし)。

于 2010-02-10T19:10:26.407 に答える