Apache commons exec 簡介和簡單ping命令方法調用實現

來源:互聯網
上載者:User

標籤:apache   java   原始碼   commons exec   

Apache commonsexec提供一些常用的方法用來執行外部進程。Apache commons exec庫提供了監視狗Watchdog來設監視進程的執行逾時,同時也還實現了同步和非同步功能。

Apache commonsexec涉及到多線程,比如新啟動一個進程,Java中需要再開三個線程來處理進程的三個資料流,分別是標準輸入,標準輸出和錯誤輸出。

需要使用該功能需要引入commons-exec-1.3.jar包,目前最新的版本為1.3版本。

 

在日常工作和生活中,我們經常需要用到網路,網路有時候會出現不穩定的情況,這個時候我們可以用ping命令查看網路情況,如果需要自動化檢測網路,那麼下面這個例子可以參考。

packagetest.ffm83.commons.exec;

 

importorg.apache.commons.exec.CommandLine;

importorg.apache.commons.exec.DefaultExecutor;

importorg.apache.commons.exec.PumpStreamHandler;

importorg.apache.commons.io.output.ByteArrayOutputStream;

/**

 * 通過commons exec啟動ping命令來查看網路情況

 * @author 範芳銘

 */

public classEasyExecPing {

         public static void main(String[] args){

                   EasyExecPing exec = newEasyExecPing();

                   exec.ping("127.0.0.1");

         }

 

         public void ping(String ip) {

                   String command = "ping" + ip;

                   try {

                            ByteArrayOutputStreamoutputStream = new ByteArrayOutputStream();

                            ByteArrayOutputStreamerrorStream = new ByteArrayOutputStream();

 

                            //命令列處理

                            CommandLinecommandline = CommandLine.parse(command);

                            //進行執行體

                            DefaultExecutor exec= new DefaultExecutor();

 

                            exec.setExitValues(null);

 

                            PumpStreamHandlerstreamHandler = new PumpStreamHandler(

                                               outputStream,errorStream);

 

                            exec.setStreamHandler(streamHandler);

                            exec.execute(commandline);//執行

 

                            String out =outputStream.toString("gbk");

                            String error =errorStream.toString("gbk");

 

                            System.out.println(out);

                            System.err.println(error);

                   } catch (Exception e) {

                            e.printStackTrace();

                   }

 

         }

}

運行情況如下:

正在 Ping 127.0.0.1 具有 32 位元組的資料:

來自 127.0.0.1 的回複: 位元組=32 時間<1msTTL=64

來自 127.0.0.1 的回複: 位元組=32 時間<1msTTL=64

來自 127.0.0.1 的回複: 位元組=32 時間<1msTTL=64

來自 127.0.0.1 的回複: 位元組=32 時間<1msTTL=64

 

127.0.0.1 的 Ping 統計資訊:

    資料包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),

往返行程的估計時間(以毫秒為單位):

    最短 = 0ms,最長 = 0ms,平均 = 0ms

 

結果非常不錯。但是ping命令還有其他寫法,比如ping 127.0.0.1 –t  ,這個表示一直查看。加到我們的程式中試一下。

我泡了一杯茶,看了下,程式還在執行;

召集了一次項目例會,會開完了,程式還在執行;

看下時間,從開始運行到現在已經過去了3小時。

一不小心就搞出了死迴圈了,趕緊想辦法吧。

 

開頭的地方提到,有監視狗Watchdog可以控制逾時,我們試一下吧。

加入監控狗的ping代碼:

packagetest.ffm83.commons.exec;

 

importorg.apache.commons.exec.CommandLine;

importorg.apache.commons.exec.DefaultExecutor;

importorg.apache.commons.exec.ExecuteWatchdog;

importorg.apache.commons.exec.PumpStreamHandler;

importorg.apache.commons.io.output.ByteArrayOutputStream;

/**

 * 通過commons exec啟動ping命令來查看網路情況

 * @author 範芳銘

 */

public classEasyExecPing {

         public static void main(String[] args){

                   EasyExecPing exec = newEasyExecPing();

                   exec.ping("127.0.0.1-t");

         }

 

         public void ping(String ip) {

                   String command = "ping" + ip;

                   try {

                            ByteArrayOutputStreamoutputStream = new ByteArrayOutputStream();

                            ByteArrayOutputStreamerrorStream = new ByteArrayOutputStream();

 

                            //命令列處理

                            CommandLinecommandline = CommandLine.parse(command);

                            //進行執行體

                            DefaultExecutor exec= new DefaultExecutor();

 

                            exec.setExitValues(null);

                            //利用監視狗來設定逾時

                            ExecuteWatchdogwatchdog = new ExecuteWatchdog(60000);

                            exec.setWatchdog(watchdog);

 

                            PumpStreamHandlerstreamHandler = new PumpStreamHandler(

                                               outputStream,errorStream);

 

                            exec.setStreamHandler(streamHandler);

                            exec.execute(commandline);//執行

 

                            String out =outputStream.toString("gbk");

                            String error =errorStream.toString("gbk");

 

                            System.out.println(out);

                            System.err.println(error);

                   } catch (Exception e) {

                            e.printStackTrace();

                   }

 

         }

}

運行結果如下:

正在 Ping 127.0.0.1 具有 32 位元組的資料:

來自 127.0.0.1 的回複: 位元組=32 時間<1msTTL=64

來自 127.0.0.1 的回複: 位元組=32 時間<1msTTL=64

來自 127.0.0.1 的回複: 位元組=32 時間<1msTTL=64

來自 127.0.0.1 的回複: 位元組=32 時間<1msTTL=64

……

 

Apache commons exec 簡介和簡單ping命令方法調用實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.