Come posso trovare l’ID di processo (pid) di un processo avviato in java?

Se ottengo un object processo in Java tramite Runtime.getRuntime().exec(...) o ProcessBuilder.start() , posso attendere attraverso Process.waitFor() , che è come Thread.join() , o potrei ucciderlo con Process.destroy() , che è come il Thread.stop() deprecato.

MA: come trovo il pid dell’object processo? Non vedo un metodo per farlo in The Official Documentation . Posso farlo in Java? Se é cosi, come?

Questo tizio chiama a colpire per ottenere il PID. Non sono sicuro se esiste una soluzione java al problema.

 /** * Gets a string representing the pid of this program - Java VM */ public static String getPid() throws IOException,InterruptedException { Vector commands=new Vector(); commands.add("/bin/bash"); commands.add("-c"); commands.add("echo $PPID"); ProcessBuilder pb=new ProcessBuilder(commands); Process pr=pb.start(); pr.waitFor(); if (pr.exitValue()==0) { BufferedReader outReader=new BufferedReader(new InputStreamReader(pr.getInputStream())); return outReader.readLine().trim(); } else { System.out.println("Error while getting PID"); return ""; } } 

Fonte: http://www.coderanch.com/t/109334/Linux-UNIX/UNIX-process-ID-java-program

Simile agli altri strumenti citati, c’è lo strumento da riga di comando jps fornito con il runtime Java. Sputa i PID di tutte le JVM in esecuzione. Il vantaggio è che l’output che si deve analizzare è limitato solo ai processi JVM.

Leo, dopo aver esaminato il problema per circa una settimana, penso che l’approccio di Jhurtado sia probabilmente l’approccio “migliore” che possiamo gestire in Java al momento. il termine “migliore” è tra virgolette perché ha il pessimo effetto collaterale di essere fondamentalmente una “supposizione” su quale sia il tuo PID figlio.

Se la tua app Java sta generando rapidamente processi nativi in ​​un sistema ad alto carico, NON c’è garanzia che il PID che prelevi nel tuo calcolo diff sia il PID del processo avviato dal thread corrente o che il PID del processo selezionato sia addirittura generato dalla nostra app (forse il sistema host stava già eseguendo comunque quel processo).

Detto questo, se non si generano dozzine di processi o il processo nativo che si sta generando è davvero unico (alcuni usi personalizzati vengono forniti con la propria app) allora questo approccio funziona bene nel qual caso il PID del processo nativo che si sta cercando è quello che vuoi

Su Windows puoi usare ‘ tasklist ‘ come Jhurtado ha indicato per ottenere l’elenco completo di PID e filtro per quello desiderato (utilizzando l’opzione / FI filter non ha funzionato per me durante il test).

Su qualsiasi sistema * nix puoi usare ” ps ax | grep ” dove NOME è un nome di processo come “nginx” o “httpd” che vuoi filtrare per ottenere la tua lista.

Inoltre, se hai bisogno di uccidere processi vaganti (ad esempio, in uscita VM) su * nix puoi ovviamente usare ” kill -9 ” e su Windows, in modo abbastanza interessante, puoi usare ” taskkill “.

Purtroppo non ottimale.

Ho incontrato lo stesso problema di te. Ho trovato una soluzione abbastanza decente, raccomando un leggero sonno prima che pensasse di assicurare che il processo sia ufficialmente avviato.

 Process p = Runtime.getRuntime().exec("cmd /c tasklist"); StringWriter writer = new StringWriter(); IOUtils.copy(p.getInputStream(), writer); String theString = writer.toString(); //System.out.println(theString); id = findLastString("javaw.exe .{1,} Console 1", theString); System.out.println(id); 

dove findLastString è definito come

 public static String findLastString(String pattern, String in) { Pattern p = Pattern.compile(pattern); Matcher matcher = p.matcher(in); String it= ""; while(matcher.find()) { it = matcher.group(); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } int firstIndex=pattern.indexOf(".{1,}"); int lastIndex=it.substring(firstIndex).indexOf(pattern.substring(pattern.indexOf(".{1,}")+5))+firstIndex; String dotOn = it.substring(pattern.indexOf(".{1,}")); it=it.substring(firstIndex, lastIndex); return it; } 

Fondamentalmente questo otterrà l’elenco dei processi in esecuzione, e trova il più recente uno con, in questo caso, il nome javaw.exe (Il mio programma stava avviando un processo java separato). È ansible sostituire javaw.exe con il nome del processo, che è ansible trovare utilizzando Task Manager. Dovrai anche ottenere il jar di I / O comune di Apache.

Penso che in Java la soluzione migliore sia ottenere la lista dei compiti prima e dopo aver generato il processo figlio. Crea un diff e ottieni il tuo PID.

è ansible ottenere la lista di attività emettendo un Runtime.getRuntime.exec("tasklist");
Si noti che tasklist.exe non è incluso con Windows XP Home edition, ma è comunque ansible scaricarlo.