Zdravim.
Hrajem sa s programovanim v lua a riesim jednu dilemu. Ako pracovat so suborom. Program sa spusta pri zapnuti pc a vypina s vypnutim pc. Zo suboru sa cita kazdu sekundu jedna hodnota a subor sa otvara iba na citanie.
No a teraz ta dilema. Otvorit ten subor a mat ho cely cas otvoreny a iba z neho citat alebo ho otvorit kazdu sekundu, precitat a zatvorit.
Ide o to ze v prvom pripade pri chybe(pade systemu/programu) mozem poskodit suborovy system a v druhom pripade mozem sposobit napriklad pri SSD rychle opotrebovanie buniek ked bude system stale zapisovat cas pristupu.
Jedna sa o subor /sys/class/net/wlp3s0/operstate a jeden subor v /home ktori je urceny iba na tuto funkciu uchovania jednej hodnoty. Ako toto riesia skutocny programatori?
Tvoja dilema nie je opodstatnená. Totižto /sys je obvykle prípojný bod virtuálneho súborového systému typu sysfs, a tak opotrebenie SSD kvôli atime v tmoto prípade nebude. Teda, nepredpokladám že by si /sys implementoval inak. Každopádne si to skontroluj vo výstupe z príkazu mount.
Hej pri tom /sys som pocital ze by to mohlo byt osetrene ale ako som pisal tiez mam dalsi v /home. Tam by to mohlo mat aky dopad?
Pozeral som teraz do fstab a na SSD mam parameter noatime cize tam by problem asi tiez nemal byt. /sys je ako si pisal sysfs. Ale aj tak by ma v kratkosti zaujimalo ako to riesia programatori co sa tym zivia. Podla coho sa rozhoduju. Taketo info nebyva v programatorskych manualoch/cviceniach.
Pokiaľ je tá hodnota nahraditeľná (obsahuje napr hodnotu z minula ku ktorej porovnávaš aktuálnu hodnotu), tak to daj do nejakého tmpfs. Napr do /dev/shm/.
Inak nepredpokladám že by boli informácie o integrovaní v začiatočníckych programátorských príručkách. Pýtaš sa totižto na veci návrhu systému ktorý má vydržať na read-only diskoch. To je obvykle advanced level návrhu firmware pre jednoúčelové krabičky. Ale odkedy je trh zaplavený klonmi RaspberryPI, tak je takých návrhov plný internet. Komu už odišlo niekoľko SD kariet v RPI, ten vie prečo.
Ok, vdaka.
A ak by to bol reálny SSD, tak by som to neriešil. Tie majú dostatočnú životnosť. Dokonca ani eMMC a podobné flash pamäte by som z rovnakého dôvodu neriešil (viď Android patlafóny). Riešil by som len ak by permanentné pam.médium bolo na niečom vrcholne nevhodnom na periodické zápisy ako SD karte alebo USB lízatku. Ale to je môj súkromný názor, tebe no nenútim.
Pre teba je to len zmena priečinku ktorá ti eliminuje možnú chybu.
Ok, ja som sa medzitym zahral s ramdiskom. Vytvoril som si 16MB do /tmp/ramdisk a tam som presunul ten subor z /home. Zasa som si vyskusal nieco nove.
Ak sa chceš pohrať, tak si skús ešte zo srandy komprimované blokované zariadenie zram, len ho treba aj sformátovať.
Preco prave do suboru musis zapisat tu hodnotu? Nemozes ju drzat v pamati? A zapisat na disk iba pri vypnuti programu. Resp. o co sa snazis? Mozno je riesenie omnoho jednoduchsie.
Ta hodnota je vystup bash skriptu ktori vyuzivam pri starte ntb na nastavenie gamma a kedze mam v ntb 2 GK tak pri starte detekujem ktora je aktivna. Vystup dam do suboru a odtial si to citalo conky ktore mi zobrazovalo aka GK je aktivna a podla toho zobrazoval aj teplotu. No a conky sa aktivuje kazdu sekundu a preto sa cita ten subor kazdu sekundu.
Mohol som tu GK nechat kontrolovat aj v conky ale zdalo sa mi menej narocne precitat jeden subor ako nechat bezat kazdu sekundu skript ktori by to nacital.
Ale ako pisem niesom programator cize islo by to urcite spavit inak/lepsie.
Ten súbor v /home sa asi nemení, ten ti stačí načítať raz, či?
Kym to bolo v rezii conky tak sa to muselo citat kazdu sekundu. Teraz ked to prepisujem do lua tak by to islo nacitat mimo hlavneho tela programu raz a potom to uz len nacitat z premennej. Len ma napadlo ako sa to bezne robi ked niekto potrebuje casto citat dajaky subor.
Este doplnim ze ta grafika sa nacita len pri starte pretoze ked chcem zmenit grafiku musim sa odhlasit. Pouzivam prime ale detekcia toho netu v /sys/class/net/wlp3s0/operstate musim kontrolovat stale pretoze prepnut z wifi na lan sa da pocas behu systemu.
Normálne napíš deamon aplikáciu (nepouži cron), ktorá bude každú sekundu zistovať a zobrazovať stav. Spúštať sa bude pri prihlásení do grafickéo sedenia (vid nastavenia svojho grafického prostredia). A pri odlasovaní sa posiela programom sinal SIGTERM alebo SIGINT alebo iný (radšej si naisto zisti alebo over aký), keď by si v programe chcel ešte na to reaovať. A program pri spústení načíta nový stav, pri ukončení uloží stav a v pripade neznáma zistí si stav aktuálny.
A k ukladaniu hodnoty. Ukladaj iba zmenu (deamon aplikácia nebude mať problém si pamätať i predchádzajúcu zmenu).
A ešte dá sa riešiť, že vytvoríš prepisovací súbor. Tj. manuálová stránka fopen(3) mód otvorenia w+, alebo dobre napíšeš program a daš mu setuid príznak pre root.
+ hore v komentároch riešenie/-ia
Tak by som to riešil ja.
Vdaka. Pri ukoncovani nepotrebujem riesit ukladanie hodnoty, cize tam je to v pohode. Ostatne pozriem.
Mód otvorenia w+ vyžaduje (alebo by mal) práva routa.
to je neskutocne, co ty tu bliakas...
Opakovanemu dotazovaniu sa na zmenu je dobre sa vyhnut minimalne vo vecsich projektoch. Usetri sa tym cas procesora a pripadne i dalsi hardware napr. v pripade ssd diskov. Da sa to cez rozne systemy notifikacii (udalosti/signalov) ktore umoznia pozastavit vykonavanie vlakna do doby kym nenastane udalost na ktoru program caka. Na druhej strane taketo riesenie moze byt zlozitejsie. Napr. suborovy system sa da monitorovat na linuxe pomocou sluzby jadra inotify ktora umoznuje zaregistrovat udalosti typu otvorenie, zapis, citanie, ... suborov a priecinkov. Bohuzial na sysfs to zatial moc nefunguje kedze je to virtualny filesystem. Ako to funguje sa da vyskusat aj v prikazovom riadku pomocou utility inotifywait (z balika inotify-tools na debian/ubuntu based distribuciach):
Sietove zariadenia sa daju monitorovat napr. pomocou udalosti ktore generuje network-manager na svojom d-bus rozhrani. Na nizsej urovni sa da zrejme vyuzit sluzba jadra netlink (toto som teraz narychlo vygooglil). Ale ci je tento pristup pouzitelny pri programovani conky scriptov netusim.inotify-tool je tiez riesenie ale kvoli conky by som nechcel doinstalovavat dalsie veci. Ale vdaka radam co tu boli som si nastudoval par veci a zistil som ze /dev/shm je pristupne aj beznemu uzivatelovi. Neviem preco som si myslel ze tam ma pristup iba root. Cize aj vytvaranie toho ramdisku je zbytocne.