2013-08-04 42 views
6

tôi cần phải viết mã, màJava:. Quá trình runned bởi Runtime.getRuntime() Giết exec()

  1. chạy quá trình với Runtime.getRuntime().exec("java -jar MyServerRunner -port MYPORT");
  2. unix tìm PID của tiến trình bằng cách thực hiện lệnh từ java đang lsof -t -i: MYPORT
  3. và giết hắn bằng pid kill -9 PID (cũng bởi lệnh từ mã java thực hiện)
  4. và sau đó thực hiện lệnh khác

NHƯNG

nếu tôi thực hiện lệnh này bằng cách Runtime.getRuntime().exec() chương trình của tôi thoát với mã thoát 137 - điều này có nghĩa là khi tôi chạy Runtime.getRuntime().exec("kill -9 PID") tôi giết quá trình programm java của tôi, nhưng không phải là chương trình, mà tôi chạy từ mã.

Tôi làm cách nào để chỉ có thể giết quá trình mà tôi chạy từ mã?

P.S. có lẽ tôi nên sử dụng ProcessBuilder?

+2

Nếu bạn đang sử dụng 'Runtime.getRuntime()' để chạy một quá trình Java khác thì bạn đang làm điều gì sai. Tại sao bạn không thể chạy lớp trong một 'Thread'? –

+0

1. Và nếu bạn đang giết quá trình với '-9' bạn cũng đang làm điều gì sai. Nếu quá trình có một cổng, nó cũng phải có một lệnh shutdown có thể được gửi đến cổng đó. 'kill -9' là một hành động cuối cùng cho một quản trị viên biết những gì anh ta đang làm (và ghi lại nó). Nó không nên được xây dựng trong các ứng dụng. 2. Thực tế là quá trình Java bắt đầu thoát ra với '137' không liên quan gì đến việc bạn đang giết quá trình sai. – EJP

Trả lời

10

Bạn có thể giết chết một phụ quá trình mà bạn đã đưa ra từ ứng dụng java của bạn với destroy:

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

Cũng lưu ý rằng nó có thể làm cho tinh thần để chạy mã khác trong một thread riêng biệt chứ không phải là trong một riêng biệt quá trình.

1

bạn có thể sử dụng .exec("ps|grep <your process name>");, và sau đó phân tích kết quả để có được PID, cuối cùng .exec("kill PID");

Do đó, quá trình của bạn bị giết nhưng ứng dụng Android vẫn còn sống.

+0

bạn có thể làm rõ làm thế nào để có được PID? , cũng có sửa ps nhỏ | grep – vikramvi

+0

http://alvinalexander.com/java/edu/pj/pj010016 đây là những gì tôi đang tìm kiếm. Với câu trả lời của bạn, nó cho PID không khớp với dòng lệnh PID. Không chắc chắn tại sao? Chuỗi s = null; \t Quy trình p = Runtime.getRuntime(). Exec ("pgrep -f selenium-server-standalone"); \t \t BufferedReader stdInput = new BufferedReader (mới \t InputStreamReader (p.getInputStream())); \t \t khi ((s = stdInput.readLine())! = Null) { \t System.out.println (s); \t} – vikramvi

0

Bạn có thể nhận được pid với sự phản chiếu trong unix (tôi biết đó là một ý tưởng tồi :)) và gọi 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)); 
Các vấn đề liên quan