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();