【Java】JavaからPingを打ってNGならエラーページを返すプログラム(死活監視の一環)
背景
・AサーバーとBサーバーが存在
・AサーバーはBサーバーへの通信が
できないと徐々にエラーを蓄積し
最後にはハングアウトする問題を
抱えている
・なのでAサーバーからBサーバーへ通信
できなくなった時点で検知したい
・監視サーバーが存在
・監視サーバー⇒Aサーバー
監視サーバー⇒Bサーバー
の通信は監視できるものの
Aサーバー⇒Bサーバーへの
監視はできない
・監視サーバーにはWebページ監視の
機能があり指定されたWebページに
アクセスして200(正常)以外のコード
が返ってきたらアラートを出す
・AサーバーにはApacheとtomcatが
搭載されている
↓
Aサーバーに、BサーバーへPingを打って
NGならエラーページを返すプログラムを
Javaで作成してWebページとして置くことで
既存の監視をそのまま活用できるようにした
プログラム
単純なプログラムなので
Javaのコードとしてはだいぶすっきりしている
と思われる
import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Ping extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { boolean success = false; String buffer; String result = null; String TIMEOUT = "255"; FileInputStream FileInputStream = new FileInputStream("/webapps/Ping/Host_IP.txt"); BufferedReader BufferReader1 = new BufferedReader(new InputStreamReader(FileInputStream)); String target = BufferReader1.readLine(); String[] command = {"ping", "-c", "1", "-t", TIMEOUT, target}; InputStream InputStream = new ProcessBuilder(command).start().getInputStream(); BufferedReader BufferReader2 = new BufferedReader(new InputStreamReader(InputStream)); int i = 0; while((buffer = BufferReader2.readLine()) != null) { if(i == 1) { if(!buffer.contains("Unreachable")) { success = true; } result = buffer; } i = i + 1; } PrintWriter out = response.getWriter(); if(success) { out.println("<html><head><title>OK</title></head><body>" + result + "</body></html>"); } else { response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } out.close(); }
自然言語に翻訳
Webページを表示させるので
当然ながらサーブレットクラスを継承
public class Ping extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
変数部分の宣言
boolean success = false; //PingがOKのときにtrueにする String buffer; //Pingの結果を格納する文字列 String result = null; //Pingの結果をWebページに表示するための文字列 String TIMEOUT = "255"; //ping のタイムアウト(ms)
Pingの対象となるIPはプログラムを修正しなくても
IPの変更ができるよう外部ファイルに記載
FileInputStream FileInputStream = new FileInputStream("/webapps/Ping/Host_IP.txt"); //外部ファイルの指定 BufferedReader BufferReader1 = new BufferedReader(new InputStreamReader(FileInputStream)); //ファイルを読み込む String target = BufferReader1.readLine(); //ファイル内の文を読み取る
Pingのコマンドを変数に入れる
WindowsとLinuxでコマンドが微妙に違う
// Windows の場合 String[] command = {"ping", "-n", "1", "-w", TIMEOUT, target}; //-n 1 でPingを1回だけ -w xxx でタイムアウトを指定
//Linux の場合 String[] command = {"ping", "-c", "1", "-t", TIMEOUT, target}; //-c 1 でPingを1回だけ -t xxx でタイムアウトを指定
変数に入れたPingコマンドを実行する
InputStream InputStream = new ProcessBuilder(command).start().getInputStream(); //コマンドを実行して変数に入れる BufferedReader BufferReader2 = new BufferedReader(new InputStreamReader(InputStream)); //コマンドの実行結果を変数に入れる
Pingの結果を変数に格納する
while((buffer = BufferReader2.readLine()) != null) { //Pingの結果を行ごとに見ていく if(i == 1) { //2行目で if(!buffer.contains("Unreachable")) { //接続できません的な文字がなければ success = true; //フラグをON } result = buffer; //結果表示用変数にPingの結果を格納 } i = i + 1; }
PingがOKなら通常ページを表示
PingがNGならエラーページを表示
PrintWriter out = response.getWriter(); //画面出力用 if(success) { //フラグがONなら out.println("<html><head><title>OK</title></head><body>" + result + "</body></html>"); //申し訳程度にPing結果を表示するページ } else { response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); //OFFなら500エラーを返すページ } out.close(); //クローズが必要らしい