2011-10-20 34 views
17

Tôi có một ứng dụng Java tạo ra một quy trình bên ngoài và đọc quá trình 'stdout thông qua InputStream. Tôi cần để có thể giết chết quá trình này khi tôi hoàn thành nó. Có cách nào để gửi tín hiệu SIGINT cho quá trình này không? (như thể tôi đã nhấn Ctrl + C từ bảng điều khiển).Làm thế nào để gửi tín hiệu SIGINT từ Java sang một quá trình bên ngoài?

Quy trình bên ngoài không phải là mã của tôi và tôi không thể sửa đổi nó.

Trả lời

2

Bạn có đang chạy chương trình bên ngoài dưới dạng java.lang.Process không? Khi lớp Process có phương thức destroy().

+8

Điều đó dường như gửi một tín hiệu SIGTERM, không phải SIGINT. Xem câu hỏi này tại đây: http://stackoverflow.com/questions/2950338/how-can-i-kill-a-linux-process-in-java-with-sigkill-process-destroy-does-sigte –

13

Bạn có thể gửi kill -SIGINT <pid> đến quá trình (cho rằng bạn biết quá trình ID):

Runtime.getRuntime().exec("kill -SIGINT 12345"); 

Tất nhiên, điều đó sẽ làm cho một giải pháp nền tảng phụ thuộc ... Có khả năng, bạn sẽ có thể để sử dụng công cụ này, mặc dù nó ở chế độ "hộp cát". Nhưng nó có thể cung cấp cho bạn một ý tưởng:

http://commons.apache.org/sandbox/runtime/

Xem thêm những câu hỏi có liên quan này ở đây:

how can I kill a Linux process in java with SIGKILL Process.destroy() does SIGTERM

+2

Không có giải pháp độc lập với nền tảng như [Windows không có Tín hiệu] (http://stackoverflow.com/questions/140111/sending-an-arbitrary-signal-in-windows). –

+0

@fix_moeller: Tôi đoán bạn nói đúng. Nhưng có thể có một thư viện cung cấp một số loại trừu tượng, ít nhất là để giết các quá trình khác ... –

+0

@Lukas Eder, tôi có một câu hỏi, nếu tôi mở quá trình này trong một chủ đề mới, và sau đó cho phép nói nó được treo cổ vv, và tôi giết nó bằng cách sử dụng SIGINT trong Linux (từ một chủ đề khác), nó cơ bản giết chết toàn bộ chương trình java của tôi, có khả năng mà chỉ có quá trình này đặc biệt bị giết trong khi chương trình của tôi vẫn đang chạy ???? –

2

Đáng tiếc là có không phải là một cách tự nhiên để gửi một tín hiệu arbirtray trong Java.

Tôi đồng ý với Lukas khi sử dụng Runtime.exec() hoặc bạn có thể sử dụng thư viện như thư viện Posix for Java.

3

Đối với những người khác đến đây từ Google nếu bạn muốn gửi tín hiệu đến Quy trình hiện tại (aka JVM), bạn có thể sử dụng phương thức sun.misc.Signal.raise(). Cá nhân tôi cần nó vì một thư viện JNI mà tôi đang sử dụng.

+0

Điều đó dường như không gửi một tín hiệu thực tế, chỉ gọi xử lý tín hiệu. Hoặc – dkagedal

+0

@Jason Axelson Tôi cũng đang sử dụng sun.misc.Signal.raise (new Signal ("TERM")); Tôi đang khởi tạo một thành phần JNI tiếp tục chạy và không bao giờ dừng lại, đêm trước n chủ đề khác của tôi bị dừng lại. vì vậy tôi đang sử dụng giải pháp này để tắt ứng dụng của mình. – vijayashankard

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