最近再弄進程管理相關的工作,因此必要的就涉及到各種系統下關於進程的管理。
這里簡單的介紹下:
如何在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);