2010-11-10 36 views
8

Tôi bắt một tín hiệu INT trong java sử dụng đoạn mã sau:Làm thế nào để bẫy một SIGNAL trong một ứng dụng java khởi tạo bằng một kịch bản bash

Signal.handle(new Signal("INT"), new SignalHandler() { 
     public void handle(Signal sig) { 

      log.warn("Received SIGINT signal. Will teardown."); 

      task.tearDown(); 

      // Force exit anyway 
      System.exit(1); 
     } 
     }); 

Khi tôi đang sử dụng java -jar file.jar để bắt đầu ứng dụng của tôi, tôi có thể nắm bắt được tín hiệu được gửi cùng với kill -INT PID.

Nếu tôi gọi java -jar file.jar & (jvm chạy ẩn), tôi không thể nhận tín hiệu được gửi đi với kill -INT.

Bất kỳ ý tưởng nào?

Cảm ơn.

+0

Quy trình java sẽ làm gì khi bạn sử dụng lệnh kill -INT? Nó chấm dứt, hoặc tiếp tục chạy? –

Trả lời

3

Làm việc cho tôi. Bạn có chắc là bạn đang giết đúng pid không? Trên Unix, bạn có thể sử dụng $! để có được pid của quá trình cuối cùng bạn khởi chạy.

$ java -jar file.jar & 
[1] 25573 

$ kill -INT $! 
Received SIGINT signal. Will teardown. 

Cập nhật:

Nếu bạn đang phát động này trong nền thông qua một kịch bản shell, hệ điều hành sẽ tạo ra một nhóm quy trình mới sẽ được miễn dịch với tín hiệu bàn phím tạo như SIGINT. Chỉ các tiến trình có ID nhóm tiến trình phù hợp với ID nhóm tiến trình của thiết bị đầu cuối hiện tại mới có thể nhận được các tín hiệu này.

Vì vậy, hãy thử chạy nó trong nhóm quá trình nhà ga hiện tại của như thế này:

. ./script.sh 

Sau đó bạn sẽ có thể gửi SIGINT.

Thông tin thêm về kiểm soát công việc here.

+0

Điều đó phù hợp với tôi. Những gì không hoạt động là bắt tín hiệu bên trong một ứng dụng bắt đầu từ bên trong một tập tin bash script. – simao

+0

@simao - cách tệp tập lệnh bash của bạn khởi chạy chương trình java sẽ quan trọng. Chương trình java của bạn có phải là daemon không? Hai tiến trình có liên quan như thế nào (tập lệnh bash và chương trình java)? – justkt

+0

Chương trình java không phải là một daemon và chạy bằng 2 luồng. Ứng dụng java được thực thi bằng cách sử dụng java -jar file.jar và bên trong một tệp .sh. Cảm ơn. – simao

0

Tôi đoán tập lệnh bash sẽ bỏ qua SIGINT và đứa trẻ đang kế thừa mặt nạ tín hiệu.

Tìm tập lệnh bash cho nội dung như thế này. (Có thể có nhiều số hơn chỉ 2.)

trap "" 2 

Chuỗi trống làm cho trình bao đặt SIG_IGN. Thay vào đó, nếu bạn sử dụng:

trap ":" 2 

Điều đó ghi lại trình xử lý không thực hiện điều gì. Khi một tiến trình con được bắt đầu, bất kỳ tín hiệu nào với trình xử lý được cài đặt được đặt lại thành SIG_DFL.

+0

Tôi đã thử, nhưng không giải quyết được vấn đề của tôi – simao

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