Jump to content
php.lv forumi

Cron jobs


Dooling

Recommended Posts

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ā.

Link to comment
Share on other sites

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...

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 :)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...