2012-08-01 36 views
16

Tôi đang làm việc trên một ứng dụng Java sử dụng các móc tắt để dọn dẹp khi ngắt/gián đoạn chương trình, nhưng tôi đã nhận thấy rằng việc thực hiện của Cygwin CTRL-C dường như không kích hoạt các móc tắt máy. Trên bề mặt nó dường như đã bị gián đoạn quá trình, từ bỏ kiểm soát trở lại dòng lệnh, tuy nhiên quá trình 'móc tắt máy không được kích hoạt ở tất cả để dọn dẹp không xảy ra.Cygwin CTRL-C (Ngắt tín hiệu) không hoạt động đúng cách - JVM Shutdown Hooks không bắt đầu

Trong cmd chúng bị bắt, nhưng do các ràng buộc khác nhau, tôi cần bằng cách nào đó khiến chúng hoạt động trong Cygwin.

Có cách nào để kích hoạt SIGINT tại một tiến trình đang chạy thông qua Cygwin hay không, hoặc có thể là một giải pháp thay thế cho các móc tắt mà tôi có thể sử dụng để làm sạch khi ngắt và ngắt kết nối?

+0

Lạ, tôi có thể chụp SIGINT trong python, trong cygwin, không có vấn đề gì. Xem http://stackoverflow.com/questions/1028687/best-way-to-gracefully-shutdown-a-java-command-line-program để biết các ý tưởng khác. – AlG

+0

Thật kỳ quặc, những nỗ lực của tôi đã tắt quá trình này nhưng nếu một SIGINT đang được tắt, các chốt tắt của ứng dụng Java của tôi chắc chắn không bắt được nó - chương trình thoát nhưng việc dọn dẹp không thực thi. Tôi sẽ có một cái nhìn thông qua chủ đề đó mặc dù, cảm ơn. – Quetzalcoatl

+0

Thảo luận về vấn đề này: http://cygwin.1069669.n5.nabble.com/CTRL-C-is-not-working-with-java-on-latest-cygwin-1-7-15-td63179.html –

Trả lời

0

This thread có thể làm sáng tỏ. Một số tùy chọn

timeout 1d <command> 

hoặc

Ctrl-C patch bởi Howard Chu

12

Bash gọi phi Cygwin (cửa sổ) thực thi thông qua một quá trình bash trung gian (bash shell -> bash -> java). Khi bạn gõ Ctrl-C, quá trình bash sẽ nhận được SIGINT và giết chết quá trình java con, do đó các móc tắt máy sẽ không được gọi. Các tiến trình Windows không nhận biết các tín hiệu như SIGINT, SIGTERM hoặc SIGKILL.

Như được mô tả trong tài liệu tùy chọn -Xrs, quy trình java đăng ký trình điều khiển điều khiển bảng điều khiển cho sự kiện cửa sổ CTRL_C_EVENT và kích hoạt một kết thúc duyên dáng gọi các móc tắt. Để có được Ctrl-C hoạt động như mong đợi, bạn cần phải chắc chắn rằng quá trình java nhận được nó, nhưng ngay bây giờ nó bị chặn bởi bash và không được chuyển tiếp tới tiến trình con.

Sự cố này có thể được khôi phục là: Làm cách nào để Cygwin có thể vượt qua Ctrl-C chuyển tiếp tới các quy trình của bảng điều khiển windows?

Lưu ý: Hành vi bash được mô tả ở trên đã được xác minh trên phiên bản 1.7.25.

+0

Tóm lại, đó là vấn đề về Cygwin, không phải là một vấn đề java. – HDave