Já precisaram recuperar o PID de uma JVM especifica? Dependendo de como o aplicativo Java foi iniciado, e se tivermos mais do que um aplicativo rodando, a missão se torna meio complexa e enrolada. Abaixo um código Java que identifica o PID de uma JVM especifica. Precisamos do utilitário jps do java, encontrado na pasta bin do jdk. Ao executarmos o jps, como saída temos o PID das JVM's em execução, junto com um identificador do processo, que são os argumentos passados para a JVM. Por exemplo, um Glassfish apresenta o nome ASMain ao lado do PID, enquanto o ActiveMQ apresenta o nome aqtivemq.jar ao lado do PID. Então é de responsabilidade do programa que precisa usar o recurso saber o nome gerado de antemão. Para ter essa informação é só rodar o aplicativo que se quer controlar, depois rodar o jps e ver as saidas. Abaixo um código que identifica se determinado aplicativo está sendo executado e pega seu PID
public boolean hasJavaProcess() throws IOException { String glassfishProcessName = "ASMain"; File file = new File(System.getenv("JAVA_HOME"), "bin"); if (System.getProperty("os.name").toLowerCase().contains("windows")) { file = new File(file, "jps.exe"); } else { file = new File(file, "jps"); } String pid = null; Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("\"" + file.getAbsolutePath() + "\""); InputStream in = process.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String line = null; while ((line = reader.readLine()) != null) { if (line.contains(glassfishProcessName )) { pid = line.replace(glassfishProcessName , "").replace(" ", ""); break; } }
reader.close()
return pid != null; }
Ah, mais uma coisa.. Para uma melhor analise dos processos Java em execução, junto do jps você pode rodar a jvisualvm, que da informações mais detalhadas sobre o que está em rodando.
Até pode parecer meio tosco deselegante, mas todas as soluções que encontrei na net eram piores, ao meu ver, pois dependiam de alguma interação com o sistema operacional, usando um ps no Linux ou o tasklist no Windows. Essa solução que criei foi bem por acaso, pois nem conhecia o jps.. mas pensei que poderia ter alguma coisa útil entre aqueles milhões de programas na pasta do sdk. E assim, solucionei o problema e fiquei bem feliz com isso! ;)
Até a próxima!
Nenhum comentário:
Postar um comentário