2011-05-13 67 views
7

Tôi có một chương trình java chạy chương trình (Python) khác như một quá trình.Chấm dứt quá trình chạy với `exec` khi chương trình chấm dứt

Process p = Runtime.getRuntime().exec("program.py", envp); 

Nếu chương trình java kết thúc quá trình xử lý, quá trình Python cũng kết thúc. Lệnh finish gửi tín hiệu đến quy trình Python để đóng nó.

Trong tình hình bình thường quá trình này được đóng theo cách này:

BufferedWriter output = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); 
output.write("@EOF\n"); 
output.flush(); 

Tuy nhiên, khi bị treo chương trình java, quá trình này không được đóng lại. Lệnh đóng không được gửi do sự cố. Có thể chấm dứt quá trình tự động mỗi khi chương trình kết thúc?

+0

Tôi cũng thực sự quan tâm đến câu trả lời cho câu hỏi này. Mặc dù tôi không thể cung cấp nó, bạn có nhớ chia sẻ lý do tại sao chương trình Java của bạn bị lỗi không? – Vinay

+1

Để câu hỏi này có thể trả lời được, bạn cần cung cấp thêm thông tin. Ví dụ: bạn có tự do sửa đổi các nguồn của một trong hai hoặc cả hai chương trình Java và Python? –

+0

Tôi sẽ không đồng ý với Vinay (haha cùng tên). Tôi thực sự đang tìm kiếm nó ngay bây giờ, nhưng tôi nghĩ rằng một cái gì đó dọc theo dòng chạy mà python Quy trình chỉ trong khi hiện tại Java Process ID đang chạy sẽ làm các trick. Không chắc tôi có đi đúng hướng hay không, nhưng câu hỏi này thực sự khiến tôi tò mò. – Vinay

Trả lời

2

Giả sử rằng bằng cách đâm bạn có nghĩa là chương trình Java ném một ngoại lệ, tôi sẽ chỉ giết quá trình Python khi điều đó xảy ra. Tôi chưa thấy mã của bạn nhưng:

class Foo { 

    Process p; 

    private void doStuff() throws Exception { 
     p = Runtime.getRuntime().exec("program.py", envp); 
     // More code ... 
    } 

    private void startStuff() { 
     try { 
      doStuff(); 
     } catch (Exception e) { 
      p.destroy(); 
     } 
    } 

    public static void main(String[] args) { 
     Foo foo = new Foo(); 
     foo.startStuff(); 
    } 
} 

Điều gì đó giống như vậy sẽ hoạt động nếu chỉ ngoại lệ khiến chương trình gặp sự cố thoát khỏi doStuff(). Thậm chí nếu bạn không mong đợi chương trình bị sập theo cách này khi nó được hoàn thành, tôi nghĩ rằng cách tiếp cận này tốt hơn là có thể gói nó trong một kịch bản lệnh shell theo cách nào đó giết quá trình Python. Xử lý nó trong chương trình của bạn là ít phức tạp và nó thậm chí có thể là một ý tưởng tốt để giữ mã sau khi chương trình kết thúc, vì bạn vẫn có thể có lỗi mà bạn không biết.

+0

Đây không phải là một giải pháp hoàn hảo nhưng mô hình này là đủ trong trường hợp của tôi. – czuk

3

hey @czuk sẽ là một móc ShutdownHook có sử dụng không? Điều này sẽ đối phó với các tình huống sau

Các máy ảo Java tắt để đáp ứng với hai loại sự kiện:

  • Chương trình thoát bình thường, khi phi daemon chủ đề thoát cuối cùng hoặc khi exit (tương đương, System.exit) phương pháp được gọi, hoặc

  • Máy ảo bị chấm dứt khi người dùng ngắt, chẳng hạn như gõ^C hoặc sự kiện toàn hệ thống, chẳng hạn như đăng xuất người dùng hoặc tắt hệ thống.

Khi hệ thống gặp sự cố này không dễ chụp.

Có thể sử dụng phương pháp Thread.setDefaultUncaughtExceptionHandler?

+2

"Tắt máy móc cũng nên hoàn thành công việc của họ một cách nhanh chóng. Khi một chương trình gọi thoát khỏi kỳ vọng là máy ảo sẽ nhanh chóng tắt và thoát. Khi máy ảo bị chấm dứt do người dùng đăng xuất hoặc tắt hệ thống, hệ điều hành bên dưới chỉ có thể cho phép một khoảng thời gian cố định để tắt và thoát. Do đó, không thể thực hiện được bất kỳ tương tác người dùng nào hoặc thực hiện tính toán lâu dài trong móc tắt máy. " Giết một quá trình Python không mất nhiều thời gian. Có vẻ như là giải pháp hoàn hảo cho OP (và làm dịu sự quan tâm của tôi). :) – Vinay

Các vấn đề liên quan