Java程序員的日常 —— 多進程開發


最近再弄進程管理相關的工作,因此必要的就涉及到各種系統下關於進程的管理。
這里簡單的介紹下:

如何在Java中執行命令

在windows下肯定是dos命令了,而在linux則為shell命令。執行的方式差不多相同:

方法1:Runtime

windows版本:
Process process = Runtime.getRuntime().exec("ipconfig /all");
Linux版本:
Process process = Runtime.getRuntime().exec("ifconfig -a");

由此可以見,java程序都是相同的,只是命令不同而已。

獲得進程輸出信息:

BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = input.readLine()) != null) {
//TODO
}

獲得進程錯誤信息:

BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line = null;
while ((line = error.readLine()) != null) {
//TODO
}

方法2:ProcessBuilder

比如上面的命令:
ProcessBuilder builder =  new ProcessBuilder("ipconfig","/all");
Process process = builder.start();

獲得輸出信息同上面,但是多了一個合並輸出和錯誤的功能:

builder.redirectErrorStream(true);
process = builder.start();
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));    
String readLine;
while (null != (readLine = br.readLine())) {    
//TODO    
}   

進程捕獲

這里捕獲進程的方式,比較投機,是對比進程啟動的前后差異:

偽代碼為:

獲取進程列表
啟動進程
獲取進程列表
對比進程列表,得到最新啟動的進程

因此,就需要知道如何獲得進程列表:

windows版本獲得進程列表

Runtime.getRuntime().exec("cmd /C tasklist");

linux版本獲得進程列表

ProcessBuilder builder =  new ProcessBuilder("ps","aux");
Process process = builder.start();    

停止進程

同上面相似,需要使用對應版本的命令:

windows版本停止進程

Runtime.getRuntime().exec("cmd /C taskkill /F /PID " + pid);

linux版本停止進程

Runtime.getRuntime().exec("kill -9 "+pid);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM