Scriu niște middleware brut - practic, am un cod vechi care trebuie să deschidă 100.000 de fișiere numai pentru citire, așteptându-mă să fie toate într-un singur folder. Nu scrie niciodată. Este multiproces, astfel încât poate încerca să deschidă ~ 30 de fișiere în același timp. În mod vechi, ar trebui să copiez de fapt fișierele în acel folder (sau să folosesc linkuri, NFS etc.). De remarcat, nu am capacitatea de a schimba acest cod vechi - este doar un binar.
Am un cod nou, elegant, care poate prelua un fișier aproape instantaneu. Vreau să leg aceste lucruri împreună, astfel încât atunci când vechiul cod încearcă să deschidă fișierul, acesta rulează de fapt, în timp real, noul cod.
Așa că m-am gândit la mkfifo și inotifywait. În loc de un folder de 100.000 de fișiere, pot crea un folder de 100.000 de conducte numite. Până acum, bine. Codul moștenit merge pentru a deschide fișierele, fără să știe că acestea sunt într-adevăr numite conducte. Problema este că nu știu în ce ordine urmează codul moștenit pentru a deschide fișierele (frumos, nu?). Așa că aș dori să declanșez conducta numită WRITE (din noul meu cod elegant) atunci când codul moștenit intră pentru citire. Nu pot genera 100.000 de scrieri și să le blochez pe toate. Așa că m-am gândit că hei - inotifywait are sens. De fiecare dată când moștenirea deschide conducta, declanșează un eveniment de citire, care poate fi apoi folosit pentru a genera pipe writer în fundal. Problema este.. inotifywait nu declanșează evenimentul de citire decât după ce scriitorul a fost generat!
Aveți vreo idee despre cum să rezolvați asta? Practic - vreau să interceptez un fișier deschis, bloc pentru câteva sute de ms în timp ce recuperez conținutul fișierului, apoi returnez acel conținut. În mod ideal, nu trebuie să creez un sistem de fișiere FUSE personalizat pentru a face acest lucru... este doar un fișier deschis doar pentru citire. Problema este că trebuie să ruleze rapid și în paralel... și nu știu ce fișiere vor fi deschise în ce ordine. Trebuie să fie un mod rapid și murdar!
Mulțumesc anticipat pentru timpul acordat tuturor.
EDIT - pentru mai multe detalii. Practic, am un cod moștenit care vrea să încarce un folder plin de fișiere PNG. Vreau ca acele fișiere PNG să provină de fapt de la un server web care returnează fișiere DICOM. Acest lucru necesită o conversie urâtă etc. Codul de încărcare PNG moștenit este foarte inflexibil.. se așteaptă ca aceste lucruri să fie fișiere. Deci, practic, vreau să interceptez fopenul codului de încărcare PNG și să rulez mai întâi următoarele patru linii de pseudocod bash. The $URL_FOR_DICOM
de mai jos poate fi derivat din $LADY_LOADED.png
nume de fișier.
wget -q -O $LAZY_LOADED.dcm $URL_FOR_DICOM
dcmj2pnm --write-png $LAZY_LOADED.dcm $LAZY_LOADED.png
rm $LAZY_LOADED.dcm
converti $LAZY_LOADED.png -redimensionare 1024x1024^ -centrul de gravitație -extent 1024x1024 $LAZY_LOADED.png
Deci, atunci când încărcătorul PNG încearcă să se încarce $LAZY_LOADED.png
(care este de fapt un FIFO), ar fi populat folosind cele de mai sus, declanșate în mod ideal de inotify. Nu pot face acest lucru în avans, deoarece setul de date este masiv - ca aproape de 0,5 PB.. deci nu pot avea oa doua copie în jur, am nevoie să fie încărcat din mers de pe serverul web.
EDITARE 2-
când încercați ifnotifywait pe o conductă numită, blochează ORICE evenimente (inclusiv deschidere, acces, citire etc.) până când conducta numită este deschisă pentru scriere și citire... (adică nu există nicio modalitate de a detecta că cititorul este gata). .idei?
Un alt utilizator a avut o problemă similară Aici fara solutie :(