Как закрыть программу, если она уже открыта на Java

Я пишу этот сервер, и я хочу проверить, запущена ли уже та же программа, если она работает, закройте программу.

Скажем, я запускаю ServerA

Затем я запускаю ServerB (это тот же сервер)

Я хочу закрыть ServerA, чтобы ServerB мог успешно работать.


person Jose Lopez    schedule 04.02.2017    source источник
comment
Посмотрите, отвечает ли это на ваш запрос.   -  person VHS    schedule 04.02.2017
comment
ServerB потребуются права администратора для закрытия ServerA.   -  person Christopher Schneider    schedule 04.02.2017
comment
Вызов pkill может быть простым решением. Хотя может быть проще сделать это в сценарии оболочки, который обертывает вашу программу, чем строить его на Java.   -  person Chris Martin    schedule 04.02.2017


Ответы (3)


Хорошо, у меня получается вот так ...

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();
    }
}
person Jose Lopez    schedule 04.02.2017
comment
Имейте в виду, что если вы выберете этот путь, для кросс-платформенной поддержки (в предыдущих версиях Windows) вам нужно будет найти ОС и вызвать соответствующую эквивалентную команду ОС для 'taskkill'. - person parabolah; 04.02.2017
comment
спасибо, я знаю, но это только для целей перехода, и, возможно, я оставлю все как есть, потому что эта программа будет работать на Windows VPS. - person Jose Lopez; 04.02.2017

Если вы хотите закрыть программу, если она открыта
Вы можете использовать:
System.exit (0);
Есть много других кодов выхода, но 0, кажется, соответствует вашим требованиям.

person Technical Blood    schedule 04.02.2017
comment
Да, но я не хочу закрывать текущую программу, я хочу закрыть программу, которая запускалась первой, чтобы могла работать новая программа. - person Jose Lopez; 04.02.2017

Использование системы для уничтожения процесса с помощью pid - это одно решение.

Можно использовать RMI (удаленный вызов метода) для создания приложений с одним экземпляром или, в вашем случае, отправить вызов уничтожения, чтобы приложение могло завершиться само. (плавное завершение, требующее, чтобы приложение продолжало работать.)

Вы также можете использовать контейнер OSGi: он лучше всего работает с жизненным циклом модуля.

person Joop Eggen    schedule 04.02.2017