2015-06-04 3 views
1

У меня есть приложение Java, которое запускает другое приложение Java (стороннего) в фоновом режиме, поэтому перед запуском стороннего фонового приложения я хочу проверить, запущено ли это приложение или нет (не хотите дождаться завершения этого заявление).
Я использую следующий код для запуска приложения стороннего Java:Проверить, работает ли приложение или нет с помощью java?

String path = new java.io.File("do123-child.cmd").getCanonicalPath(); 
Runtime.getRuntime().exec(path); 

Примечание: Файл «do123-child.cmd» называют «.bat» файл для запуска этого приложения.

Чтобы проверить, является ли данное приложение работает или нет, я использую следующий код [Ref link]:

boolean result = false; 
try { 
    String line; 
    Process p = Runtime.getRuntime().exec("tasklist.exe"); 
    BufferedReader input = 
      new BufferedReader(new InputStreamReader(p.getInputStream())); 
    while ((line = input.readLine()) != null) { 
     if(line.startsWith("myApp.exe")){ 
      result = true; 
      break; 
     } 
    } 
    input.close(); 
} catch (Exception err) { 
    err.printStackTrace(); 
} 
return result; 

Я хочу знать, есть ли другой способ сделать это без Итерируя все процессы в настоящее время работает ? Как:

Process p = Runtime.getRuntime().exec("tasklist /FI \"IMAGENAME eq myApp.exe\" /NH"); 
int exitVal = p.exitValue(); 
//if above code throw "java.lang.IllegalThreadStateException" means application is running. 

но выше код возврата 0 для всех приложений.

Заранее спасибо.

+0

@MichaelLaffargue: В данной ссылке (вами) код ждать окончания процесса/приложения, но в моем случае я не хочу ждать окончания приложение, я просто хочу знать, работает ли приложение или нет. – BhushanK

+0

My Bad @Bhushan. 'tasklist' - это способ пойти в Windows (если вы не хотите использовать [JNA] (https://github.com/twall/jna)) –

+0

@MichaelLaffargue: На самом деле я не хочу использовать' JNA' как мой приложение предназначено как для окон, так и для MAC, выше код будет работать как для меня, так и для меня просто изменить команду '" tasklist.exe "на mac specific, значит, команда будет определяться в соответствии с типом ОС, но логика будет похожа на t пробовал этот код на MAC). – BhushanK

ответ

3

Вы можете использовать jps для проверки запущенных приложений Java. jps в комплекте с JRE.

jps -l 
19109 sun.tools.jps.Jps 
15031 org.jboss.Main 
14040 
14716 

Вы можете очистить список от этой программы, используя Runtime.getRuntime().exec() и reading the input stream, а затем искать имена пакетов для матча в Java.

Так как вы хотите, чтобы избежать переборе всех результатов, вы можете Grep результата с помощью findstr вернуть основной p.exitValue() результат вы ищете:

Process p = Runtime.getRuntime().exec("jps -l | findstr /R /C:\"com.myapp.MyApp\""); 
int exitVal = p.exitValue(); // Returns 0 if running, 1 if not 

Конечно findstr является Windows, специфической, так что вы» должны будете использовать grep вместо этого на Mac:

Process p = Runtime.getRuntime().exec("jps -l | grep \"com.myapp.MyApp\""); 
int exitVal = p.exitValue(); // Returns 0 if running, 1 if not 

инструмент jps использует внутренний API (MonitoredHost), чтобы получить эту информацию, так что вы могли бы сделать это полностью в Java, а также:

String processName = "com.myapp.MyApp"; 

boolean running = false; 
HostIdentifier hostIdentifier = new HostIdentifier("local://localhost"); 

MonitoredHost monitoredHost; 
monitoredHost = MonitoredHost.getMonitoredHost(hostIdentifier); 

Set activeVms = monitoredHost.activeVms(); 
for (Object activeVmId : activeVms) { 
    VmIdentifier vmIdentifier = new VmIdentifier("//" + String.valueOf(activeVmId) + "?mode=r"); 
     MonitoredVm monitoredVm = monitoredHost.getMonitoredVm(vmIdentifier); 
    if (monitoredVm != null) { 
     String mainClass = MonitoredVmUtil.mainClass(monitoredVm, true); 
     if (mainClass.toLowerCase().equals(processName.toLowerCase())) { 
      running = true; 
      break; 
     } 
    } 
} 

System.out.print(running); 
+0

Только работа с процессом JVM нет? Это то, чего хочет OP, просто для того, чтобы совершенствовать мои знания. –

+0

Да, это работает только с процессами JVM. Если вы хотите отслеживать не-Java-приложение, вам нужно использовать другое решение. – seanhodges

+0

@seanhodges: Я запутался в 'String processName =" com.myapp.MyApp ";' '' 'com.myapp.MyApp" 'является именем ImageName или классом?Если это имя класса, то как я могу узнать имя класса другого приложения Java (стороннего)? – BhushanK

Смежные вопросы