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);
posted @   xingoo  阅读(8695)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
历史上的今天:
2015-06-07 《小艾上班记》—— 读后总结
2014-06-07 剑指OFFER之从上往下打印二叉树(九度OJ1523)
点击右上角即可分享
微信分享提示