Dooling Posted April 7, 2010 Report Share Posted April 7, 2010 Sveiki! Varbūt kādam ir pieredze šādā jautājumā un var padalīties tajā. Ir 4 cron jobi, kas tiek palaisti dažādos laika intervālos - piemēram, viens ik pēc 5 min, otrs - 10 min, trešais - 15 min, ceturtais - 30 min. Katrs ir cron jobs veic pieprasījumus mysql un php pusē veic aprēķinus, kuru rezultātus piefiksē db. Cron jobs kurš tiek palaist ik pēc 30 min, veic sarežģītākos aprēķinus un koda izpildes laiks var palielināties arvien vairāk palielinoties datiem. Tad jautājums: ja nav izpildījies cron jobs (ik 30 pēc min) līdz galam, labāk būtu bloķēt nākamā cron joba izpildi (piemēram nākamo cron bloķē kurš izpildās ik pēc 5 min) vai nē? Cerams domu sapratāt. Padalieties ar savu pieredzi līdzīgā gadījumā. Quote Link to comment Share on other sites More sharing options...
ohmygod Posted April 7, 2010 Report Share Posted April 7, 2010 Saīsināt izpildes laiku neesi mēģinājis? Saģenerē db daudz, daudz datus un testē izpildes laikus. Nezinot, kas tev tur darbojas un ko kurš skripts dara grūti pateikt vai vajag aizturēt vai nevajag. Vai 5min skripta dati atkarīgi no 30min skripta rezultāta un otrādi... Quote Link to comment Share on other sites More sharing options...
Dooling Posted April 7, 2010 Author Report Share Posted April 7, 2010 Saīsināt, esmu mēģinājis, bet vai tas ir labākais variants neesmu pārliecināts. 5min skripta dati ir atkarīgi no 30min skripta. Quote Link to comment Share on other sites More sharing options...
Roze Posted April 7, 2010 Report Share Posted April 7, 2010 Diezgan jocīgi ka 5 min dati ir atkarīgi no 30min skripta datiem - loģiski itkā sanāktu otrādi jo kapēc tad vispār darbināt to 5min skriptu ja jau 'sarežģītais' crons griežas krietni retāk. Parasti gan tipiskā problēma ir tajā momentā kad cronjoba, kas iešedulēts ik pa 5min, izpildes laiks paliek lielāks nekā 5min (t.i. intervāls kurā crons tiek darbināts) attiecīgi tākā pašam cronam ir vienalga tad viss beidzas ar to ka uz kastes griežas 100 procesi kas visi mēģina darīt vienu un to pašu. Prātā nāk divi varianti: 1. Taisīt statusa failus kuros ierakstīt vai konkrētais skripts var darboties vai nē un tad skripta sākumā checkot to: teiksim 30min skriptā 30min.php: <? file_put_contents('is_30_minscript_running',1); // tavs kods file_put_contents('is_30_minscript_running',0); ?> Bet 5min skriptā: <? if(file_get_contents('is_30_minscript_running')) { die('30min script still running!'); } // tavs kods ?> Mīnus šim ir ja lielais skripts kautkādā brīdī nogāžas (fatal error) tad pēdējais statuss paliek nekorekts un sīkais 5min skripts vismaz 30min nedarbojas.. (var arī vienkārši checkot vai griežas konkrēts process teiksim iekš 5min skripta sākumā ielikt kaut ko tādu kā: <? if(`ps aux | grep [3]0minskripts.php`) { die('30min script still running!'); } // grepam japadod regulara ekspresija lai vinsh nenogrepo pats sevi no processlistes // tavs kods ?> 2. Otrs variants ir uzrakstīt piem bash scriptu kas darbojas permanenti ar while loopu un sleep. Tīri teorētisks piemērs #!/bin/bash while [ 1 ]; do php 5min.php sleep 300 php 5min.php sleep 300 php 5min.php sleep 300 php 5min.php sleep 300 php 5min.php sleep 300 php 5min.php php 30min.php done Quote Link to comment Share on other sites More sharing options...
kasisppr Posted April 7, 2010 Report Share Posted April 7, 2010 Jautājums vai tev ir svarīga cron job izpildes secība, kur 5min nedrīkst palaisties, ja 10, 15 un 30 min ilgie nav beiguši darbību? Vienkāršs variants ir izveidot tabulu ar ierakstiem visiem 4 cron jobiem. Kad tie sāk izpildīties uzseto kautkādu "In progress" statusu, kuru nomaini kad attiecīgi cron jobs beidzas. Savukārt skriptos uzliec cron joba status chekošanu, ja "In Progress" skipojam darbu un gaidm nākamo logu. Problēma varētu būt, ja tev ilgākais ik pēc 30 min skripts "uzkaras", tad pārējie tā arī var nesākt izpildīties. Bet nu principā skaties kāda tev situācija. Quote Link to comment Share on other sites More sharing options...
rATRIJS Posted April 7, 2010 Report Share Posted April 7, 2010 Es nezinu vai šis noderēs, bet ja tev ir svarīga secība, tad, iespējams, ir vērts neveidot 4 cron job'us, bet tikai vienu? Un tajā vienā ietvert visas tās darbības, kas paradzētas visiem 4 cron'iem? Tikai secīgi, protams. Tādā veidā tev viņi visi izpildīsies secīgi un nebūs iespējams, ka kāds izpildās pirms iepriekšējais ir pabeidzis savu darbu. Quote Link to comment Share on other sites More sharing options...
Aleksejs Posted April 7, 2010 Report Share Posted April 7, 2010 Var izmantot lock failus. 5min jobs: #!/bin/bash if [ -f 5min.job ] then #nav beidzies iepriekšējais 5min job exit 1 else touch 5min.job x=0 while [ $x -lt 16 && ( -f 10min.job || -f 15min.job || -f 30min.job ) ] do sleep 15 x=`expr $x + 1` done if [ $x -ge 16 ] then #nogaidījām 4 minūtes = 15s * 16, taču citu jobu lock faili nepazuda rm -f 5min.job exit 2 else #TE ir tā vieta, kurā izpildam 5min skriptu 5min.sh rm -f 5min.job exit 0 fi fi Rakstīju no galvas, neko negarantēju ;) Līdzīgi uzraksta arī pārējos 3 skriptus Quote Link to comment Share on other sites More sharing options...
Dooling Posted April 8, 2010 Author Report Share Posted April 8, 2010 Tika realizēts kaut kas līdzīgs Alekseja pieminētajam + vēl logā tiek piefiksēts katra cron joba darbība, t.i., cikos sāka un beidza savu izpildi. Visiem paldies, kas dalījās dalījās ar savu padomu :) Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.