Avem un cron care porneste la fiecare X minute un script Python.
Trebuie sa ne asiguram la momentul pornirii scriptului, daca este deja un proces sistem care ruleaza scriptul respectiv sa faca exit() noua instanta de script. Deci sa fie singleton procesul.
Am gasit diverse biblioteci care fac asta, dar vreau sa vad si care sunt recomandarile voastre venite din experienta.
Cel mai important e sa fie un mecanism robust, care face fata la crash-uri ale scriptului, reboot-uri hard ales sitemului etc.
Mă gândesc că un tool precum Supervisor ar avea grijă să țină mereu o instanță a acelui proces pornită + loguri de toate felurile. Să înțeleg că folosiți direct cron-ul din OS?
Later edit: se descurcă de minune să dirijeze procese dar nu este întocmai menit să înlocuiască un cron
asta este forma in care s-a tradus restrictia, dar care e esenta ei?
de obicei, restrictiile de felul asta sunt date de o concurenta pe anumite resurse.
eu obisnuiesc sa verific exclusivitatea asta prin verificarea acelei resurse care imi genereaza restrictia.
Cam asta e soluția cea mai simplă: fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) unde fd e un fișier deschis pentru scriere (ex: open('/var/myscript.lock', 'wb')). Fiindcă fd dispare la ieșirea procesului nu trebuie să îți faci griji ce se întâmplă dacă procesul moare brusc.
Operația este atomică deci nu are race condition ca și verificat existența unui fișier.
PS. Se presupune că sistemul de fișiere e normal, nu NFS sau ceva avion.
Scriptul face niste operatii de actualizare de consum/facturare, sa zicem.
Motivul pentru care ar trebuie sa fie singleton e ca s-ar bate mai multe procese pe aceleasi tabele, fara sa aduca vreun beneficiu, in schimb ar face sa dureze si mai mult procesele din cauza lock-urilor MySQL pe tabele.
File lock it is then.
Side note: vom renunta si la cron-uri in favoare taskurilor Celery programate. Pentru ca folosim deja Celery si avem si operatii de retry, detalii stare task in UI pentru userii admin, vizibilitate pe care o vom extinde, de ex. cu log per task vizibil in UI. Din ce am vazut e pretabil foarte bine file lock-ul si din taskuri Celery.