2013-08-04 1 views
6

ho bisogno di scrivere un codice, cheJava:. Processo gestito da Runtime.getRuntime() Uccidi exec()

  1. run processo unix con Runtime.getRuntime().exec("java -jar MyServerRunner -port MYPORT");
  2. trovare PID del processo attraverso il comando di esecuzione da Java codice lsof -t -i: MYPORT
  3. e ucciderlo da pid kill -9 PID (anche con comando da codice Java in esecuzione)
  4. e quindi eseguire altri comandi

MA

se eseguo questo comando Runtime.getRuntime().exec() mio programma esce con codice di uscita 137 - questo significa che quando ho eseguito Runtime.getRuntime().exec("kill -9 PID") uccido processo di mio java programma, ma non il programma, che ho eseguito dal codice.

Come posso eliminare SOLO il processo che eseguo dal codice?

P.S. forse dovrei usare ProcessBuilder?

+2

Se si utilizza 'Runtime.getRuntime()' per eseguire un altro processo Java, si sta facendo qualcosa di sbagliato. Perché non puoi semplicemente eseguire la classe in un 'Thread'? –

+0

1. E se stai uccidendo i processi con '-9' stai anche facendo qualcosa di sbagliato. Se il processo ha una porta, dovrebbe anche avere un comando di spegnimento che può essere inviato a quella porta. 'kill -9' è un'azione di ultima istanza per un amministratore che sa cosa sta facendo (e lo registra). Non dovrebbe essere integrato nelle applicazioni. 2. Il fatto che il processo Java avviato sia terminato con '137' non ha nulla a che fare con il fatto che stai uccidendo il processo sbagliato. – EJP

risposta

10

Si può uccidere un sotto-processo che si è lanciato dalla vostra applicazione Java con destroy:

Process p = Runtime.getRuntime().exec("java -jar MyServerRunner -port MYPORT"); 
p.destroy(); 

Notare inoltre che potrebbe avere senso per eseguire che altro codice in un thread separato piuttosto che in un separato processi.

1

è possibile utilizzare .exec("ps|grep <your process name>");, e quindi analizzare il risultato per ottenere il PID, finalmente .exec("kill PID");

Pertanto, il processo viene ucciso ma Android app ancora vivo.

+0

puoi chiarire come ottenere il PID? , c'è anche una piccola correzione ps | grep – vikramvi

+0

http://alvinalexander.com/java/edu/pj/pj010016 questo è quello che stavo cercando. Con la tua risposta fornisce PID che non corrisponde al PID della riga di comando. Non sono sicuro del perché? String s = null; \t Processo p = Runtime.getRuntime(). Exec ("pgrep -f selenium-server-standalone"); \t \t BufferedReader stdInput = new BufferedReader (new \t InputStreamReader (p.getInputStream())); \t \t while ((s = stdInput.readLine())! = Null) { \t System.out.println (s); \t} – vikramvi

0

È possibile ottenere il pid con la riflessione in unix (lo so che è una cattiva idea :)) e chiamare kill;

Process proc = Runtime.getRuntime().exec(
    new String[] {"java","-classpath",System.getProperty("java.class.path"),... }); 
Class<?> cProcessImpl = proc.getClass(); 
Field fPid = cProcessImpl.getDeclaredField("pid"); 
if (!fPid.isAccessible()) { 
    fPid.setAccessible(true); 
} 
Runtime.getRuntime().exec("kill -9 " + fPid.getInt(proc));