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 runningProcessIds = new HashMap<>(); static String pidPath ="pid.txt"; static { runningProcessIds = loadFromFile(pidPath); for(Map.Entry 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 map){ try (BufferedWriter writer = new BufferedWriter(new FileWriter(pidPath))) { for (Map.Entry 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 loadFromFile(String filePath){ Map 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); } } }