106 lines
3.5 KiB
Java
106 lines
3.5 KiB
Java
package com.tuoheng.steam.util;
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import java.io.*;
|
|
import java.util.*;
|
|
|
|
@Service
|
|
public class ProcessManager {
|
|
|
|
private static final String DELIMITER = "=";
|
|
|
|
static Map<Long, String> runningProcessIds = new HashMap<>();
|
|
|
|
static String pidPath ="pid.txt";
|
|
|
|
static {
|
|
runningProcessIds = loadFromFile(pidPath);
|
|
for(Map.Entry<Long, String> entry : runningProcessIds.entrySet()){
|
|
try {
|
|
killProcessByPID(entry.getKey());
|
|
}catch (Exception e){
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
runningProcessIds.clear();
|
|
writeToFile(runningProcessIds);
|
|
}
|
|
|
|
public static void registerProcess(Long process) {
|
|
runningProcessIds.put(process,TimeUtils.formatDateToString(new Date()));
|
|
writeToFile(runningProcessIds);
|
|
}
|
|
|
|
public static void unRegisterProcess(Long process) {
|
|
runningProcessIds.remove(process);
|
|
writeToFile(runningProcessIds);
|
|
}
|
|
|
|
public static void writeToFile(Map<Long, String> map){
|
|
try (BufferedWriter writer = new BufferedWriter(new FileWriter(pidPath))) {
|
|
for (Map.Entry<Long, String> entry : map.entrySet()) {
|
|
writer.write(entry.getKey() + DELIMITER + entry.getValue());
|
|
writer.newLine();
|
|
}
|
|
}catch (IOException ignored){}
|
|
}
|
|
|
|
public static void appendToFile(Long pid,String strDate) {
|
|
|
|
try (BufferedWriter writer = new BufferedWriter(new FileWriter(pidPath,true))) {
|
|
writer.write(pid+ DELIMITER + strDate);
|
|
writer.newLine();
|
|
}catch (IOException ignored) {}
|
|
}
|
|
|
|
public static Map<Long, String> loadFromFile(String filePath){
|
|
Map<Long, String> map = new LinkedHashMap<>();
|
|
File file = new File(filePath);
|
|
try {
|
|
if(!file.exists()){
|
|
file.createNewFile();
|
|
}
|
|
}catch (Exception e){
|
|
e.printStackTrace();
|
|
}
|
|
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
|
|
String line;
|
|
while ((line = reader.readLine()) != null) {
|
|
String[] parts = line.split(ProcessManager.DELIMITER, 2); // Split into key and value
|
|
if (parts.length == 2) {
|
|
Long key = Long.parseLong(parts[0].trim());
|
|
String value = parts[1].trim();
|
|
map.put(key, value);
|
|
}
|
|
}
|
|
} catch (IOException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
return map;
|
|
}
|
|
|
|
public static void killProcessByPID(long pid) throws IOException, InterruptedException {
|
|
String os = System.getProperty("os.name").toLowerCase();
|
|
ProcessBuilder processBuilder;
|
|
|
|
if (os.contains("win")) {
|
|
// Windows: Use taskkill command
|
|
processBuilder = new ProcessBuilder("cmd", "/c", "taskkill /PID " + pid + " /F");
|
|
} else {
|
|
// Linux/Unix/macOS: Use kill command
|
|
processBuilder = new ProcessBuilder("bash", "-c", "kill -9 " + pid);
|
|
}
|
|
|
|
Process process = processBuilder.start();
|
|
int exitCode = process.waitFor();
|
|
|
|
if (exitCode == 0) {
|
|
System.out.println("Process with PID " + pid + " terminated successfully.");
|
|
} else {
|
|
System.err.println("Failed to terminate process with PID " + pid + ". Exit code: " + exitCode);
|
|
}
|
|
}
|
|
|
|
}
|