2009-12-13 24 views
12

tôi là tạo ra quy trình con theo cách này:Nhận id subprocess trong Java

String command = new String("some_program"); 

Process p = Runtime.getRuntime().exec(command); 

Làm thế nào tôi có thể nhận được rằng subprocess id?

P.S. Tôi đang làm việc trên Linux.

+0

Chuỗi khen = "some_program" là tốt hơn trong trường hợp này – pstanton

+0

Nó không phải là mã thực. Chỉ cần một đoạn trích để mô tả vấn đề. – Pawka

Trả lời

27

Vẫn không có API công khai cho điều này (xem http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4244896) nhưng có giải pháp thay thế.

Một cách giải quyết đầu tiên sẽ được sử dụng một chương trình bên ngoài như ps và gọi nó bằng cách sử Runtime.exec() để có được pid :)

Một số khác được dựa trên thực tế rằng lớp java.lang.Process là trừu tượng và rằng bạn thực sự nhận một lớp con cụ thể tùy thuộc vào nền tảng của bạn. Trên Linux, bạn sẽ nhận được một java.lang.UnixProcess có một trường riêng int pid. Sử dụng phản chiếu, bạn có thể dễ dàng nhận được giá trị của lĩnh vực này:

Field f = p.getClass().getDeclaredField("pid"); 
f.setAccessible(true); 
System.out.println(f.get(p)); 
+0

nice .. Tôi tự hỏi tại sao điều này không công khai? – Bozho

+0

Câu hỏi hay! Và tôi tự hỏi tại sao một lỗi như vậy được mở trong hơn 10 năm mà không có độ phân giải? –

+3

Có lẽ vì Sun muốn bạn ở lại bên trong JVM. –

1

Tôi đã cố gắng (và không thành công) để thực hiện việc này trong khi quay lại. Tôi đã kết thúc gói lệnh của tôi trong một kịch bản shell mà đổ pid vào một tập tin. Không phải là giải pháp tốt nhất nhưng nó đã cho tôi vượt qua rào cản này.

+0

Đây là ý tưởng đầu tiên, những gì tôi nghĩ. Nhưng nó không phù hợp với tôi. "Lệnh" có thể là hầu như bất kỳ chương trình nào, không được chuẩn bị bởi tôi. Dù sao cũng cảm ơn. – Pawka

1

Cũng không có cách nào được ghi lại để thực hiện việc này, nhưng điều đó xảy ra là lớp triển khai quy trình là UNIXProcess và nó có trường pid. Vì vậy, bạn có thể sử dụng phản chiếu để truy cập trường riêng tư này để nhận ID. Googling xung quanh bạn sẽ tìm thấy thủ đoạn khác của gọi vỏ khác để có được đầu ra ps và loại điều. Không có gì dễ dàng.

1

Từ here

public static void main(String[] args) throws IOException { 
    byte[] bo = new byte[100]; 
    String[] cmd = {"bash", "-c", "echo $PPID"}; 
    Process p = Runtime.getRuntime().exec(cmd); 
    p.getInputStream().read(bo); 
    System.out.println(new String(bo)); 
} 
+0

Tôi đã tìm thấy bài đăng đó trước đây, nhưng nó không phù hợp với tôi. Tôi không thể chuẩn bị sửa đổi chương trình con xử lý mà nó sẽ xuất PID. – Pawka