Tôi đang viết một số phần mềm trung gian tổng thể - về cơ bản, tôi có một số mã cũ cần mở 100.000 tệp chỉ để đọc, hy vọng tất cả chúng sẽ nằm trong một thư mục. Nó không bao giờ viết. Nó là đa xử lý nên nó có thể cố gắng mở ~30 tệp cùng một lúc. Theo cách cũ, tôi sẽ phải thực sự sao chép các tệp vào thư mục đó (hoặc sử dụng các liên kết, NFS, v.v.). Đáng chú ý là tôi không có khả năng thay đổi mã cũ này - nó chỉ là mã nhị phân.
Tôi có một số mã mới, ưa thích có thể truy xuất một tệp gần như ngay lập tức. Tôi muốn liên kết những thứ này lại với nhau, vì vậy khi mã cũ cố gắng mở tệp, nó thực sự đang chạy mã mới trong thời gian thực.
Vì vậy, tôi đã nghĩ đến mkfifo và inotifywait. Thay vì một thư mục gồm 100.000 tệp, tôi có thể tạo một thư mục gồm 100.000 đường ống được đặt tên. Càng xa càng tốt. Mã kế thừa sẽ mở các tệp mà không biết rằng chúng thực sự được đặt tên là các đường dẫn. Vấn đề là, tôi không biết mã kế thừa sẽ mở các tệp theo thứ tự nào (tốt, phải không?). Vì vậy, tôi muốn KÍCH HOẠT đường ống có tên VIẾT (từ mã mới ưa thích của tôi) khi mã kế thừa được đưa vào để đọc. Tôi không thể tạo ra 100.000 lượt viết và chặn tất cả chúng. Vì vậy, tôi nghĩ này - inotifywait có ý nghĩa. Mỗi khi di sản mở đường ống, nó sẽ kích hoạt một sự kiện đã đọc, sau đó có thể sử dụng sự kiện này để sinh ra trình ghi đường ống trong nền. Vấn đề là.. inotifywait không kích hoạt sự kiện đọc cho đến SAU KHI người viết đã được sinh ra!
Bất kỳ ý tưởng làm thế nào để giải quyết điều này? Về cơ bản - tôi muốn chặn một tệp đang mở, chặn trong vài trăm mili giây trong khi tôi truy xuất nội dung của tệp, sau đó trả lại nội dung đó. Lý tưởng nhất là tôi không phải tạo một hệ thống tệp FUSE tùy chỉnh để thực hiện việc này.. nó chỉ là một tệp chỉ đọc được mở. Vấn đề là điều này cần chạy nhanh và song song.. và tôi không biết tệp nào sẽ được mở theo thứ tự nào. Phải là một cách nhanh chóng và bẩn thỉu!
Cảm ơn trước cho thời gian của tất cả mọi người.
CHỈNH SỬA - để biết thêm chi tiết. Về cơ bản, tôi có một số mã kế thừa muốn tải một thư mục chứa đầy các tệp PNG. Tôi muốn các tệp PNG đó thực sự đến từ một máy chủ web trả về các tệp DICOM. Điều này yêu cầu một số chuyển đổi xấu, v.v. Mã tải PNG kế thừa rất không linh hoạt.. nó muốn những thứ này là các tệp. Vì vậy, về cơ bản, tôi muốn chặn fopen của mã tải PNG và chạy bốn dòng mã giả bash sau trước. Các $URL_FOR_DICOM
dưới đây có thể được bắt nguồn từ $LADY_LOADED.png
tên tập tin.
wget -q -O $LAZY_LOADED.dcm $URL_FOR_DICOM
dcmj2pnm --write-png $LAZY_LOADED.dcm $LAZY_LOADED.png
rm $LAZY_LOADED.dcm
chuyển đổi $LAZY_LOADED.png -thay đổi kích thước 1024x1024^ -trung tâm trọng lực -phạm vi 1024x1024 $LAZY_LOADED.png
Vì vậy, khi trình tải PNG cố gắng tải $LAZY_LOADED.png
(thực ra là một FIFO), nó sẽ được phổ biến bằng cách sử dụng ở trên, lý tưởng nhất là được kích hoạt bằng inotify. Tôi không thể làm điều này trước vì tập dữ liệu rất lớn - như gần 0,5PB.. vì vậy tôi không thể có bản sao thứ hai xung quanh, tôi cần nó được tải nhanh chóng từ máy chủ web.
CHỈNH SỬA 2-
khi thử ifnotifywait trên một ống dẫn có tên, nó sẽ chặn BẤT KỲ sự kiện nào (bao gồm mở, truy cập, đọc.. v.v.) cho đến khi ống dẫn có tên được mở để viết VÀ đọc... (nghĩa là không có cách nào để phát hiện trình đọc đã sẵn sàng).. .ý tưởng?
Một người dùng khác gặp vấn đề tương tự đây không có giải pháp :(