3

cronを介してこれらのメッセージを出力するPerlプログラムがあります。

recv timed out (60000 ms) at /usr/local/lib/perl/5.8.8/MongoDB/Cursor.pm line 251.
recv timed out (60000 ms) at /usr/local/lib/perl/5.8.8/MongoDB/Cursor.pm line 251.
recv timed out (60000 ms) at /usr/local/lib/perl/5.8.8/MongoDB/Cursor.pm line 251.

軽減するために次の手順を実行しました。

  • $ collection-> find(...)の周りの評価ブロック
  • $ cursor-> next()周辺の評価ブロック
  • 接続query_timeout値60000
  • 接続タイムアウト1000

    サーバーの負荷が高いため、タイムアウトは驚くことではありません。しかし、タイムアウトをスマートにキャプチャして、正常に終了したいと思います。

    助言がありますか?

    アップデート:

    $ cursor-> next()呼び出しでrecvタイムアウトが確実に発生していると判断しました。

    # doesn't capture
    {   
        local $SIG{__DIE__} = sub { return; };    
        $doc_ref = $cursor->next();
    };
    
    # doesn't capture
    eval { $doc_ref = $cursor->next(); };
    
  • 4

    2 に答える 2

    1

    おそらく、diieではなく、exit呼び出しを行うため、evalではキャッチできません。Test::Trapを試してください。

    主に(排他的ではありませんが)テストスクリプトで使用するために:ステロイドのブロック評価、構成可能で拡張可能ですが、デフォルトではトラップ(Perl)STDOUT、STDERR、警告、例外、終了コード、およびボックス化されたブロックからの戻り値テストコード。

      use Test::Trap;
    
      my @r = trap { some_code(@some_parameters) };
      if ( $trap->exit != 0 ){
        say 'Expecting &some_code to exit with not 0';
      }
    
    于 2012-12-05T10:41:15.810 に答える
    1

    幸いなことに、これは でありdie、トラップすることができます。AnyEvent + EVデーモンを書いたことがあります。これは、次の汚いトリックを使ってリスポーンすることで死 (邪悪な笑い) をごまかすものです。

    use FindBin qw($Script);
    use EV;
    $EV::DIED = sub { warn $@; exec $^X, $Script, qw(restart) };
    

    dieまた、brian d foy がOverride die with END or CORE::GLOBAL::dieの記事で説明している普遍的なトラップもあります。

    $SIG{__DIE__} = sub { warn "I'm sorry, Dave, I'm afraid I can't do that" };
    
    于 2012-12-05T13:31:00.683 に答える