2017-02-04 3 views
3

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

Say я бегу ServerA

Тогда я бегу ServerB (которым тот же самый сервер)

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

+0

Обратите внимание, что [this] (http://stackoverflow.com/questions/660205/start-java-program-only-if-not-already-running) отвечает на ваш запрос. – VHS

+0

'ServerB' потребует прав администратора для закрытия' ServerA'. –

+0

Вызов 'pkill' может быть простым решением. Хотя это может быть проще сделать в сценарии оболочки, который обертывает вашу программу, а не создает ее на Java. –

ответ

1

Хорошо мне удается сделать это вот так ...

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(); 
    } 
} 
+0

Имейте в виду, если вы возьмете этот маршрут, который для кросс-платформенной поддержки (прошлой Windows) вам нужно будет найти ОС и вызвать соответствующую эквивалентную команду ОС для «taskkill» –

+0

спасибо, я знаю, но это только для целей devoloping , и, возможно, я оставлю это как есть, потому что эта программа будет работать на Windows VPS. –

0

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

+0

Да, но я не хочу закрыть текущую программу, я хочу закрыть программу, которая запускалась сначала, чтобы новая программа могла запускаться –

0

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

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

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