亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java實現Linux下雙守護進程

2019-11-26 15:22:43
字體:
來源:轉載
供稿:網友

一、簡介

  現在的服務器端程序很多都是基于Java開發,針對于Java開發的Socket程序,這樣的服務器端上線后出現問題需要手動重啟,萬一大半夜的掛了,還是特別麻煩的。
  大多數的解決方法是使用其他進程來守護服務器程序,如果服務器程序掛了,通過守護進程來啟動服務器程序。
  萬一守護進程掛了呢?使用雙守護來提高穩定性,守護A負責監控服務器程序與守護B,守護B負責監控守護A,任何一方出現問題,都能快速的啟動程序,提高服務器程序的穩定性。

  Java的運行環境不同于C等語言開發的程序,Java程序跑在JVM上面。不同于C語言可以直接創建進程,Java創建一個進程等同于使用java -jar xxx.jar啟動一個程序。
  Java啟動程序并沒有C#類似的單實例限制,你可以啟動多個,但是你不能啟動多個,不能讓多個守護A去守護服務器程序,萬一啟動了多個服務器程序怎么辦?

二、技術講解

這里的技術講解比較粗略,具體請百度一下,這里只講解作用。
1、jps命令。
  JDK自帶的命令工具,使用jps -l可以列出正在運行的Java程序,顯示Java程序的pid與Name。只對Java程序有效,其實查看的是運行的JVM
2、java.nio.channels.FileLock類的使用
  這個是Java new IO中的類,使用他可以維持在讀取文件的給文件加上鎖,判斷文件時候有鎖可以判斷該文件是否被其他的程序使用
3、ProcessBuilder與Process
  這兩個原理差不多,都是調用系統的命令運行,然后返回信息。但是硬編碼會導致你的Java程序失去可移植性,可以將命令獨立到配置文件中。

三、設計原理

Server:服務器程序
A:守護進程A
B:守護進程B
A.lock:守護進程A的文件鎖
B.lock:守護進程B的文件鎖
----------------------------------------------------------------------------------
Step 1:首先不考慮Server,只考慮A與B之間的守護
1.A判斷B是否存活,沒有就啟動B
2.B判斷A是否存活,沒有就啟動A
3.在運行過程中A與B互相去拿對方的文件鎖,如果拿到了,證明對面掛了,則啟動對方。
4.A啟動的時候,獲取A.lock文件的鎖,如果拿到了證明沒有A啟動,則A運行;如果沒有拿到鎖,證明A已經啟動了,或者是B判斷的時候拿到了鎖,如果是A已經啟動了,不需要再次啟動A,如果是B判斷的時候拿到了鎖,沒關緊  要,反正B會再次啟動A。
5.B啟動的時候原理與A一致。
6.運行中如果A掛了,B判斷到A已經掛了,則啟動A。B同理。

Step 2:加入Server
1.A用于守護B和Server,B用于守護A。
2.原理與Step 1 一致,只是A多個一個守護Serer的任務。
3.當A運行的時候,使用進程pid檢測到Server已經掛了,就啟動Server
4.如果Server與A都掛了,B會啟動A,然后A啟動Server
5.如果Server與B掛了,A啟動Server與B
6.如果A與B都掛了,守護結束

Step 3:使用Shutdown結束守護,不然結束Server后會自動啟動

四、實現
1、GuardA的實現

復制代碼 代碼如下:

 public class GuardA {
     // GuardA用于維持自己的鎖
     private File fileGuardA;
     private FileOutputStream fileOutputStreamGuardA;
     private FileChannel fileChannelGuardA;
     private FileLock fileLockGuardA;
     // GuardB用于檢測B的鎖
     private File fileGuardB;
     private FileOutputStream fileOutputStreamGuardB;
     private FileChannel fileChannelGuardB;
     private FileLock fileLockGuardB;
 
     public GuardA() throws Exception {
         fileGuardA = new File(Configure.GUARD_A_LOCK);
         if (!fileGuardA.exists()) {
             fileGuardA.createNewFile();
         }
         //獲取文件鎖,拿不到證明GuardA已啟動則退出
         fileOutputStreamGuardA = new FileOutputStream(fileGuardA);
         fileChannelGuardA = fileOutputStreamGuardA.getChannel();
         fileLockGuardA = fileChannelGuardA.tryLock();
         if (fileLockGuardA == null) {
             System.exit(0);
         }
        
         fileGuardB = new File(Configure.GUARD_B_LOCK);
         if (!fileGuardB.exists()) {
             fileGuardB.createNewFile();
         }
         fileOutputStreamGuardB = new FileOutputStream(fileGuardB);
         fileChannelGuardB = fileOutputStreamGuardB.getChannel();
     }
 
     /**
      * 檢測B是否存在
      *
      * @return true B已經存在
      */
     public boolean checkGuardB() {
         try {
             fileLockGuardB = fileChannelGuardB.tryLock();
             if (fileLockGuardB == null) {
                 return true;
             } else {
                 fileLockGuardB.release();
                 return false;
             }
         } catch (IOException e) {
             System.exit(0);
             // never touch
             return true;
         }
     }
 }

2、GuardServer的實現

復制代碼 代碼如下:

 public class GuardServer {
     private String servername;
 
     public GuardServer(String servername) {
         this.servername = servername;
     }
 
     public void startServer(String cmd) throws Exception {
         System.out.println("Start Server : " + cmd);
         //將命令分開
 //        String[] cmds = cmd.split(" ");
 //        ProcessBuilder builder = new ProcessBuilder(cmds);
    
         //
         ProcessBuilder builder=new ProcessBuilder(new String[]{"/bin/sh","-c",cmd});
         //將服務器程序的輸出定位到/dev/tty
         builder.redirectOutput(new File("/dev/tty"));
         builder.redirectError(new File("/dev/tty"));
         builder.start(); // throws IOException
         Thread.sleep(10000);
     }
 
     /**
      * 檢測服務是否存在
      *
      * @return 返回配置的java程序的pid
      * @return pid >0 返回的是 pid <=0 代表指定java程序未運行
      * **/
     public int checkServer() throws Exception {
         int pid = -1;
         Process process = null;
         BufferedReader reader = null;
         process = Runtime.getRuntime().exec("jps -l");
         reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
         String line;
         while ((line = reader.readLine()) != null) {
             String[] strings = line.split("//s{1,}");
             if (strings.length < 2)
                 continue;
             if (strings[1].contains(servername)) {
                 pid = Integer.parseInt(strings[0]);
                 break;
             }
         }
         reader.close();
         process.destroy();
         return pid;
     }
 }

3、GuardAMain實現

復制代碼 代碼如下:

 public class GuardAMain {
     public static void main(String[] args) throws Exception {
         GuardA guardA = new GuardA();
         Configure configure = new Configure();
         GuardServer server = new GuardServer(configure.getServername());
         while (true) {
             // 如果GuardB未運行 運行GuardB
             if (!guardA.checkGuardB()) {
                 System.out.println("Start GuardB.....");
                 Runtime.getRuntime().exec(configure.getStartguardb());
             }
             // 檢測服務器存活
             if (server.checkServer() <= 0) {
                 boolean isServerDown = true;
                 // trip check
                 for (int i = 0; i < 3; i++) {
                     // 如果服務是存活著
                     if (server.checkServer() > 0) {
                         isServerDown = false;
                         break;
                     }
                 }
                 if (isServerDown)
                     server.startServer(configure.getStartserver());
             }
             Thread.sleep(configure.getInterval());
         }
     }
 }

4、Shutdown實現

復制代碼 代碼如下:

 public class ShutDown {
     public static void main(String[] args) throws Exception {
         Configure configure = new Configure();
         System.out.println("Shutdown Guards..");
         for (int i = 0; i < 3; i++) {
             Process p = Runtime.getRuntime().exec("jps -l");
             BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
             String line;
             while ((line = reader.readLine()) != null) {
                 if (line.toLowerCase().contains("Guard".toLowerCase())) {
                     String[] strings = line.split("//s{1,}");
                     int pid = Integer.parseInt(strings[0]);
                     Runtime.getRuntime().exec(configure.getKillcmd() + " " + pid);
                 }
             }
             p.waitFor();
             reader.close();
             p.destroy();
             Thread.sleep(2000);
         }
         System.out.println("Guards is shutdown");
     }
 }

5、GuardB與GuardA類似

五、下載與使用

項目文件夾:guard_demo

下載地址:http://pan.baidu.com/s/1bn1Y6BX

如果有什么疑問或者建議,請聯系我

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91在线视频精品| 中文字幕一精品亚洲无线一区| 久久亚洲精品成人| 69av成年福利视频| 久久久久中文字幕2018| 久久99视频免费| 国产精品色婷婷视频| 2023亚洲男人天堂| 久久99精品国产99久久6尤物| 色婷婷**av毛片一区| 亚洲第一偷拍网| 日韩电影中文 亚洲精品乱码| 91在线看www| 国产69久久精品成人| 国产精品91久久久| 国产精品自产拍在线观看中文| 欧美午夜视频在线观看| 亚洲韩国青草视频| 国产精品视频永久免费播放| 亚洲激情在线观看视频免费| 亚洲精品国产品国语在线| 亚洲一级一级97网| 国产手机视频精品| 日本精品视频在线播放| 国产99久久精品一区二区永久免费| 亚洲免费中文字幕| 91影院在线免费观看视频| 成人免费网站在线观看| 日韩国产中文字幕| 中文字幕久久久| 日本一区二区在线播放| 日本国产精品视频| 91国产美女在线观看| 91国产视频在线播放| 欧美劲爆第一页| 国产精品av电影| 亚洲风情亚aⅴ在线发布| 欧美尺度大的性做爰视频| 日韩欧亚中文在线| 亚洲日韩欧美视频一区| 日韩电影第一页| 久久69精品久久久久久久电影好| 欧美性高潮在线| 久久精品欧美视频| 国产亚洲视频中文字幕视频| 97成人精品视频在线观看| 成人在线观看视频网站| 日本久久久久久久久| 欧美专区在线视频| 国产精品三级网站| 亚洲精品一区久久久久久| 久久免费视频网| 国产精品1234| 国内精品400部情侣激情| 中文字幕日韩综合av| 精品国产一区二区三区久久狼5月| 色诱女教师一区二区三区| 国产精品成人aaaaa网站| 久久艳片www.17c.com| 亚洲电影免费观看高清完整版| 久久九九精品99国产精品| 亚洲春色另类小说| 神马国产精品影院av| 国产成人综合精品在线| 亚洲乱码一区二区| 亚洲性生活视频在线观看| 亚洲视频777| 亚洲精品自拍偷拍| 日韩中文字幕精品| 18一19gay欧美视频网站| 亚洲xxx视频| 亚洲视频精品在线| 91精品国产综合久久久久久久久| 日韩av电影在线免费播放| 按摩亚洲人久久| 91久久精品美女高潮| 亚洲japanese制服美女| 久久久久久久久国产精品| 欧美成人精品影院| 久久亚洲精品视频| 国产美女主播一区| 在线观看视频99| 久久韩剧网电视剧| 日韩大片免费观看视频播放| 国产精品永久免费观看| 久久精品视频va| 欧美日本在线视频中文字字幕| 午夜精品久久久久久久久久久久久| 91久热免费在线视频| 久久久久久这里只有精品| 国产极品精品在线观看| 亚洲成avwww人| 日韩av毛片网| 91精品国产自产在线观看永久| 国模精品系列视频| 亚洲性av在线| 欧美激情网站在线观看| 中文字幕在线观看日韩| 国语自产精品视频在免费| 日韩高清av在线| 亚洲最大的成人网| 国产精品专区h在线观看| 精品一区二区亚洲| 77777亚洲午夜久久多人| 欧美一级淫片aaaaaaa视频| 92看片淫黄大片欧美看国产片| 国产精品精品视频一区二区三区| 欧美日韩国产限制| 久久久久久亚洲精品不卡| 69精品小视频| 国产精品一区二区三区成人| 精品国产一区二区三区久久久| 国产精品黄色影片导航在线观看| 国产美女被下药99| 国产精品入口日韩视频大尺度| 欧美丰满少妇xxxxx做受| 伦理中文字幕亚洲| 国产精品99一区| 国产精品69精品一区二区三区| 亚洲男人天堂九九视频| 狠狠干狠狠久久| 91成人在线播放| 91超碰caoporn97人人| 久久久成人的性感天堂| 国产精品视频在线播放| 亚洲欧美另类中文字幕| 亚洲欧美激情精品一区二区| 91色视频在线导航| 97国产真实伦对白精彩视频8| 8050国产精品久久久久久| 欧美日韩国产精品专区| 日韩精品一二三四区| 精品久久在线播放| 91成人精品网站| 久久精品一偷一偷国产| 国产精品人成电影| 欧美激情欧美狂野欧美精品| 91免费在线视频网站| 久久香蕉精品香蕉| 亚洲精品女av网站| 国产一区二区色| 欧美日韩国产精品专区| 菠萝蜜影院一区二区免费| 日韩av免费看网站| 成人免费直播live| 国产成人自拍视频在线观看| 国模私拍视频一区| 亚洲精品456在线播放狼人| 精品综合久久久久久97| 亚洲精品动漫100p| 亚洲精品资源在线| 国产97人人超碰caoprom| 亚洲自拍偷拍第一页| 亚洲精品免费网站| 91香蕉嫩草神马影院在线观看| 日韩亚洲一区二区| 欧洲成人免费aa| 国产欧美精品va在线观看| 久久中文字幕一区| 国产精品视频久久久| 亚洲永久在线观看| 国产精品久久久久久中文字| 欧美电影在线观看| 97av在线播放|