2011-11-16 24 views
5

Tôi đang sử dụng thư viện thương mại của bên thứ ba có vẻ như đang bị rò rỉ xử lý tệp (Tôi đã xác minh điều này trên Linux bằng cách sử dụng lsof). Cuối cùng, máy chủ (Tomcat) bắt đầu nhận được lỗi "Quá nhiều lỗi tệp mở" và tôi phải khởi động lại JVM.Tôi có thể đóng các xử lý tệp được mở bằng mã mà tôi không sở hữu không?

Tôi đã liên hệ với nhà cung cấp. Trong khi chờ đợi, tuy nhiên, tôi muốn tìm một giải pháp cho việc này. Tôi làm không phải có quyền truy cập vào mã nguồn của họ. Có cách nào, trong Java, để dọn dẹp các tệp xử lý mà không cần có quyền truy cập vào đối tượng File gốc (hoặc FileWriter, FileOutputStream, v.v ...) không?

Trả lời

0

Bạn có thể, khi khởi động, mở một loạt tệp và sử dụng File*putStream.getFD() để có được một bó số java.io.FileDescriptors, sau đó đóng chúng lại, nhưng giữ lại các bộ mô tả. Sau đó, bạn có thể có thể create streams sử dụng những mục được lưu trữ FileDescriptor và đóng chúng.

Tôi chưa thử nghiệm điều này, vì vậy sẽ không ngạc nhiên nếu nó không hoạt động trên một số nền tảng.

+1

Anh ấy KHÔNG có quyền truy cập vào mã nguồn. –

+0

@AhmedMasud, anh ta không cần nó nếu mô tả tập tin cũ cho phép rèn luồng. Tất cả những gì anh ta cần là khả năng chạy mã Java bên trong một cá thể tomcat mà anh ta điều khiển. –

+0

khái niệm thú vị nhưng đó là giả định rằng các mô tả tập tin sử dụng tái chế lành mạnh sau khi đóng; cũng có thể khó để tìm ra KHI tạo luồng trong chuỗi; –

2

cách thú vị là viết thư viện động và sử dụng LD_PRELOAD để tải nó cho phiên bản java bạn đang khởi chạy ... DLL này có thể ghi đè cuộc gọi hệ thống mở (2) cơ bản để đóng các bộ mô tả tệp hiện có của quá trình trước khi chuyển cuộc gọi đến triển khai libc (hoặc hạt nhân). Bạn cần phải làm một số kế toán nghiêm túc và có thể xử lý các chủ đề; Nhưng nó có thể được thực hiện. Đặc biệt là nếu bạn lấy các gợi ý từ/proc/pid/fd/để tìm hiểu xem liệu đóng có phù hợp với mục tiêu fd hay không.

+0

Bạn không cần phải viết thư viện tải trước của riêng mình để thực hiện chặn syscall trên Linux. Chỉ cần chạy tomcat trong ['systrace'] (http://www.provos.org/index.php?/categories/2-Systrace). –

+0

@MikeSamuel errr. systrace là một bản vá hạt nhân (và một bản vá thực sự khủng khiếp ở đó) + một loạt các văn bản chính sách; và là quá mức cần thiết cho công việc cụ thể này. Một đối tượng chia sẻ có thể được phát triển trong một vài giờ mà thực hiện điều này từ đầu; được quản lý tốt và có thể dễ dàng tắt mà không cần khởi động lại hệ thống sản xuất của ai đó. –

+0

Wow! Điều đó nghe có vẻ giống như một dự án :-). Tôi không chắc mình có các kỹ năng cho việc này hay không, nhưng +1 cho một câu trả lời sáng tạo. –

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