0

Nagios では、監視しようとしているアクティブ サーバーとスタンバイ サーバーのセットアップがあります。アクティブがオンラインになると、この OID に応答します。スタンバイはこの OID に応答しませんが、それでも頻繁にポーリングしたいと考えています。このようにして、サーバーがステータスを反転/フロップしても、SNMP チェックは引き続き機能します。

定期的なチェックのために Nagios で両方のサーバーを構成しています。私の目標は、スタンバイをチェックし、タイムアウトした場合は、アクティブ (変数 $peer で定義) をチェックして、スタンバイが正しくスタンバイであることを確認することです。その後、OK で終了します。スタンバイおよびアクティブが応答しない場合は、Critical を終了します。

PHP snmpwalk は、タイムアウトしてホストに到達できない場合に警告を送信します。カスタム エラー ハンドラーを使用して、警告をキャッチし、それについて何かをしています。

ただし、2回目のSNMPチェックを開始できないようです。スクリプトの残りの部分を通り過ぎて、途中ですべてのデバッグをエコーし​​ます。私の予想される結果は終了することでした。

このセットアップでネストされた try と catch を行うにはどうすればよいですか?

// First, setup error handling. 
function errorHandler($errno, $errstr, $errfile, $errline) {
    throw new Exception($errstr, $errno);
}
set_error_handler('errorHandler');

if (!is_null($peer)) { 
    //Dummy SNMP check to see if we get a timeout error or not. 
    try {
        echo "trying ".$host." \n";
        snmpwalk($host,$community,$oid);
    }
    catch (Exception $e) {
        // If we get here, it timed out. Now check to see if the peer server is up.
        echo "timed out, trying ".$peer." \n";
        try {
            snmpwalk($peer,$community,$oid);
        }
        catch (Exception $e) {
            // At this point, the peer server is up, so chances are we're the standby.
            echo "standby is up, we are ok";
            $output = "OK: It appears this is the standby server. \n"; 
            fwrite(STDOUT, $output);
            exit(0);
        }
    echo "Hmm, something else happened. \n";
    }
}

// Restore default error handler. 
restore_error_handler();
4

1 に答える 1

1

あなたの catch ブロックには、$peer への接続に成功したと思われることを示すコメントが含まれていますが、catch ブロックは $peer への接続に失敗した場合にのみ実行されます。

コードを catch ブロックの外に移動すると、目的の動作が得られます。

于 2013-09-23T01:06:48.093 に答える