问题描述
用java写一个程序, 希望运行在windows系统的后台, 这个程序不允许同时运行多个, 程序启动的时候, 需要检查当前是否有该程序的进程在运行, 如果有则杀死该进程.
实现原理
- 获取当前进程ID
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
//获取当前进程ID
String currentProcessID = runtimeMXBean.getName().split("@")[0];
- 获取所有jvm进程
//获取所有的进程采用了jps命令, 该命令位于jdk的bin目录jps.exe, 同时需要lib下的tools.jar提供支持, 可将jps.exe和tools拷贝到jre中对应的bin和lib下, 采用jps实现获取所有jvm进程
Process p = Runtime.getRuntime().exec("jre1.8.32/bin/jps -l");
InputStream in = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String temp;
while (( temp = reader.readLine()) != null) {
System.out.println("获取到进程:" + temp);
}
- 杀死进程
Runtime.getRuntime().exec("taskkill /f /pid " + pid);
代码如下
private static void removeOldProcess() {
// 获取监控主机
try {
//获取当前进程ID
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
String currentProcessID = runtimeMXBean.getName().split("@")[0];//当前进程ID
//jps命令获取所有的jvm进程, jps命令位于jdk下bin目录的jps.exe, jps命令需要jdk下lib目录中tools.jar的支持
Process p = Runtime.getRuntime().exec("jre1.8.32/bin/jps -l");
InputStream in = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String temp;
while (( temp = reader.readLine()) != null) {
if (!temp.contains("com.friendcom.ic.App") && !temp.contains("ic.jar")){
continue;
}
String pid = temp.substring(0, temp.indexOf(" "));
if (currentProcessID.equalsIgnoreCase(pid)){
System.out.println("当前服务进程:" + temp);
continue;
}
System.out.println("杀死旧服务进程:" + temp);
Runtime.getRuntime().exec("taskkill /f /pid " + pid);
}
} catch (Exception e) {
e.printStackTrace();
}
}