2013-08-04 27 views
6

muszę napisać kod, któryJava. Proces prowadzona przez Runtime.getRuntime() Zabij exec()

  1. przebiegu procesu UNIX z Runtime.getRuntime().exec("java -jar MyServerRunner -port MYPORT");
  2. znaleźć PID procesu poprzez wykonanie polecenia z Java Kod lsof -t -i: MYPORT
  3. i zabić przez PID kill -9 PID (również przez polecenie z kodu java wykonanie)
  4. a następnie wykonanie innych poleceń

ALE

gdybym wykonać tego polecenia przez Runtime.getRuntime().exec() mój program kończy pracę z kodem wyjścia 137 - oznacza to, że gdy uruchamiam Runtime.getRuntime().exec("kill -9 PID") zabiję proces My java programowo, ale nie program, że biegnę z kodu.

Jak mogę zabić TYLKO proces, który uruchamiam z kodu?

P.S. może powinienem użyć ProcessBuilder?

+2

Jeśli używasz 'Runtime.getRuntime()' do uruchomienia innego procesu Java, to robisz coś nie tak. Dlaczego nie możesz po prostu uruchomić klasy w "wątku"? –

+0

1. A jeśli zabijasz procesy z '-9', robisz też coś złego. Jeśli proces ma port, powinien również mieć komendę zamknięcia, którą można wysłać do tego portu. 'kill -9' jest ostatnią deską ratunku dla administratora, który wie, co robi (i loguje go). Nie należy go wbudowywać w aplikacje. 2. Fakt, że rozpoczęty proces Java wychodzi z '137' nie ma nic wspólnego z faktem, że zabijasz niewłaściwy proces. – EJP

Odpowiedz

10

Można zabić podproces, które uruchomiły z aplikacji java z destroy:

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

Należy również zwrócić uwagę, że może to mieć sens, aby uruchomić ten inny kod w osobnym wątku, a nie w oddzielnym proces.

1

można użyć .exec("ps|grep <your process name>");, a następnie przeanalizować wyniki, aby uzyskać PID wreszcie .exec("kill PID");

Dlatego Twój proces jest zabity, ale android aplikacja wciąż żyje.

+0

Czy możesz wyjaśnić, jak uzyskać PID? , jest też mała poprawka ps | grep – vikramvi

+0

http://alvinalexander.com/java/edu/pj/pj010016 Tego właśnie szukałem. Z twoją odpowiedzią daje PID, który nie pasuje do linii poleceń PID. Nie jestem pewien, dlaczego? String s = null; Proces: p = Runtime.getRuntime(). \t \t BufferedReader stdInput = nowy BufferedReader (nowy \t InputStreamReader (p.getInputStream())); \t \t podczas ((s = stdInput.readLine())! = Null) { \t System.out.println (s); \t} – vikramvi

0

Możesz dostać pid z odbiciem w unixie (wiem, że to zły pomysł :)) i zadzwoń do 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)); 
Powiązane problemy