Я пишу этот сервер, и я хочу проверить, запущена ли уже та же программа, если она работает, закройте программу.
Скажем, я запускаю ServerA
Затем я запускаю ServerB (это тот же сервер)
Я хочу закрыть ServerA, чтобы ServerB мог успешно работать.
Я пишу этот сервер, и я хочу проверить, запущена ли уже та же программа, если она работает, закройте программу.
Скажем, я запускаю ServerA
Затем я запускаю ServerB (это тот же сервер)
Я хочу закрыть ServerA, чтобы ServerB мог успешно работать.
Хорошо, у меня получается вот так ...
public static void main(String[] args){
String PIDtoKill = readPIDFile();
if(!PIDtoKill.isEmpty())
killPID(PIDtoKill);
saveThisPIDtoFile();
}
Используемый метод ....
private static String readPIDFile() {
try {
for (String line : Files.readAllLines(Paths.get("C:\\Users\\MyUser\\Desktop\\PIDsRunning.txt")))
return line;
}
catch (IOException e1) {
e1.printStackTrace();
}
return "";
}
private static void saveThisPIDtoFile() {
String pid = ManagementFactory.getRuntimeMXBean().getName();
pid = pid.substring(0, pid.indexOf("@"));
List<String> lines = Arrays.asList(pid);
Path file = Paths.get("C:\\Users\\MyUser\\Desktop\\PIDsRunning.txt");
try {
Files.write(file, lines, Charset.forName("UTF-8"));
}
catch (IOException e) {
e.printStackTrace();
}
}
private static void killPID(String pIDtoKill) {
try {
Runtime.getRuntime().exec("taskkill /F /PID " + pIDtoKill);
}
catch (IOException e) {
e.printStackTrace();
}
}
Если вы хотите закрыть программу, если она открыта
Вы можете использовать:
System.exit (0);
Есть много других кодов выхода, но 0, кажется, соответствует вашим требованиям.
Использование системы для уничтожения процесса с помощью pid - это одно решение.
Можно использовать RMI (удаленный вызов метода) для создания приложений с одним экземпляром или, в вашем случае, отправить вызов уничтожения, чтобы приложение могло завершиться само. (плавное завершение, требующее, чтобы приложение продолжало работать.)
Вы также можете использовать контейнер OSGi: он лучше всего работает с жизненным циклом модуля.
ServerB
потребуются права администратора для закрытияServerA
. - person Christopher Schneider   schedule 04.02.2017pkill
может быть простым решением. Хотя может быть проще сделать это в сценарии оболочки, который обертывает вашу программу, чем строить его на Java. - person Chris Martin   schedule 04.02.2017