1

URLのセットに1つずつ接続するPerlスクリプトを作成しました。URLに接続するたびに、結果を取得していくつかの操作を実行します。

ただし、エラーが発生する可能性がいくつかあります。

私が対処しようとしているこれらの中で最も重要なのは、可用性の問題です。その間にインターネット接続が機能しなくなる場合があります。したがって、1000個のURLのリストがあり、スクリプトがそれらの500個を正常に通過した後、インターネットが機能しなくなったとしましょう。その結果、スクリプトはエラーで中止されます。この状態を制御し、ここで一時停止と再開の機能を実装したいと思います。

説明する数行のコード:

$mech=WWW::Mechanize->new();
$mech->timeout(10);

$url="http://example.com/index.php?id=";

while(<INPUT>)
{
chomp $_;
$word=$_;
$url=$url.$word;
eval{$mech->get($url);};

if($@)
{
  # Pause the Script once the if condition evaluates to true
}

....

}

スクリプトを一時停止したい条件がいくつかある可能性があります。

したがって、スクリプトに何らかのシグナルを渡して、スクリプトを一時停止させる必要があることを理解しています。同時に、「いくつかのキーの組み合わせ」を押してスクリプトを再開できるエンドユーザーに機能を提供する必要があります。

私の推測では、これにはいくつかのOSAPI呼び出しが含まれます。

Linuxでは、Ctrl+Zキーの組み合わせを押してプロセスを一時停止する方法があります。

ただし、これをPerlスクリプトで自動化する方法がわかりません。

これに対する解決策を見つけるために詳細が必要な場合はお知らせください。

ありがとう。

4

1 に答える 1

7

読み取りを待っている間にプロセスをブロックするのはかなり標準的です。ブロックされている間は、CPU時間を受け取りません。Perlが通常行うこと以外に、OS呼び出しは必要ありません。したがって、「再開する準備ができたらEnterキーを押して、を読んでください」というプロンプトを発行するだけSTDINです。

Blocked-on-IOは、OSのプロセステーブルの状態として標準です。ごく最近、ダミーサーバーとして機能するソケットテストスクリプトをPerlで作成しました。ある夜急いで出発し、朝、ダミーサーバーの端末に「ポート3371で待機しています...」というプロンプトが表示されました。それは何週間もそのようにとどまっていたでしょう。

したがって、すべてをラベル付きのIOループでラップすることができ、死ぬか鳴く代わりに、次のようなループコントロールを使用します。

BIT_OF_WORK:
while ( $more_work ) { 
    ALL_GOOD:
    while ( $all_good ) {
       ...
       my $socket = open_socket() or last ALL_GOOD;
       ...
       last BIT_OF_WORK unless ( $more_work = @queue );
       ...
    }
    say 'Detected Network Down. Press Enter to continue';
    my $user_input = <STDIN>;
}
say 'Phew, that was a lot of work!';

redoあなたもあなたの好みにもっと見つけるかもしれません。

于 2012-09-11T15:35:38.210 に答える