2009-08-04 37 views
7

Tôi có một chương trình java tạo tệp khóa để đảm bảo rằng không có lệnh nào khác chạy cùng lúc với nó. Nếu chương trình chạy nó tạo ra các tập tin, và khi xuất cảnh, hoặc là thành công hoặc thông qua một ngoại lệ, tập tin được gỡ bỏ. Nhưng nếu người dùng nhấn Ctrl + C, đóng thiết bị đầu cuối hoặc theo cách khác thì ngắt kết nối, tệp sẽ không bị xóa. Có cách nào để phát hiện lệnh ngắt này và đảm bảo rằng tập tin cũng bị xóa trong trường hợp này không?Làm thế nào để hệ thống xử lý Java ngắt như Ctrl + C

+0

Trớ trêu thay, tôi quên mất câu hỏi này và [trả lời] (https://stackoverflow.com/a/34188676/113632) một liên quan sáu năm (và kinh nghiệm thực tế liên quan) sau này. @Amber hoàn toàn đúng là hầu hết các ứng dụng Java nên sử dụng các móc tắt máy, nhưng để * thực sự * xử lý 'SIGINT' và các tín hiệu khác bạn cần sử dụng' sun.misc.Signal', như được thảo luận trong câu hỏi được liên kết. – dimo414

Trả lời

5

Bạn có thể muốn xem xét shutdown hooks.

Ngoài ra, đây có lẽ là một trùng lặp hoặc gần như trùng lặp này câu hỏi trước SO từ một hoặc hai ngày trước:

How can I "intercept" Ctrl+C in a CLI application?

+0

Các chốt tắt máy thậm chí có chạy khi JVM bị ngắt bất thường không? Tôi sẽ nghi ngờ điều đó. –

+0

@mmyers, điều đó phụ thuộc vào định nghĩa của bạn về bất thường. :) Ctrl-C thường sẽ kích hoạt chúng. Đóng terminal thường không. – jsight

+1

Không có cách nào đáng sợ 100% để xóa các tập tin khóa như vậy. Timestamping họ có thể giúp đỡ, nhưng nó đi kèm với chi phí phải làm điều đó đĩa viết mỗi vài giây. Rất nhiều chương trình chỉ tìm kiếm một tệp khóa khi khởi động và nhắc người dùng về nó. – Amber

2

Cách duy nhất tốt để đối phó với điều này là để đánh dấu thời gian tập tin đăng nhập của bạn và cập nhật tệp nhật ký với dấu thời gian mới sau mỗi vài giây. File.deleteOnExit sẽ giúp, nhưng không có phương pháp nào là dễ dàng (điều gì xảy ra khi ai đó chỉ kéo dây điện?).

Nếu bạn viết dấu thời gian, sau đó bạn có thể kiểm tra dấu thời gian hợp lệ (được viết gần đây) và ghi đè lên tệp nhật ký nếu nó quá cũ. Bằng cách đó, một lockfile cũ sẽ không cản trở người dùng.

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