Het voorkomen van simultaan draaiende cronjobs met Flock

Cronjobs zijn taken die periodiek worden uitgevoerd en ingesteld kunnen worden via het commando crontab. Het is een eenvoudige manier om taken automatisch uit te voeren. De basis uitleg over cronjobs kunt u terugvinden in een eerdere blog post op onze website.

Een cronjob kan echter ook een groot probleem voor de server opleveren wanneer een zelfde taak meerdere keren en op het zelfde moment actief is. Een veel voorkomend probleem is, dat een nieuwe taak wordt gestart terwijl de oude nog niet volledig afgerond is.

Als u bijvoorbeeld een cronjob heeft ingesteld die elke 5 minuten een taak uitvoert en die taak eigenlijk 7 minuten nodig heeft om te voltooien, dan zal op minuut 5 de zelfde taak nog een keer gestart worden. Dit heeft als gevolg dat er op dat moment twee de zelfde taken lopen. Het kan zelfs zodanig uit de hand lopen dat bij verkeerde instellingen een taak meer dan 10 – of meer – keer gelijktijdig kan draaien. U kunt zich voorstellen dat dit niet wenselijk is. Zo kan het mogelijk de volgende gevolgen hebben:

  • Datacorruptie; omdat de zelfde taak meerdere keren wordt uitgevoerd kan dat tot vreemde veranderingen leiden in uw (database-)gegevens.
  • Een trage website; omdat alle resources (systeembronnen) van uw server worden aangeroepen. Immers elke draaiende cronjob heeft deze nodig en zal ze reserveren.

Uiteraard kan het zijn dat, het script wat wordt uitgevoerd, zelf al een mechanisme gebruikt om simultaan draaiende processen te voorkomen. In dat geval hoeft u Flock niet te gebruiken. Voor scripts die geen dergelijk mechanisme hebben, is er de volgende oplossen:

Flock

Onze HPW servers zijn standaard uitgerust met de “flock” tool. Deze tool zorgt er voor dat de zelfde cronjob niet meerdere keren gestart kan worden. Dit doet flock door een tijdelijk “lock-” bestand aan te maken. Zo lang dit bestand aanwezig is zal er geen nieuwe taak gestart worden. Wanneer het commando (de cronjob) is uitgevoerd zal flock het tijdelijke bestand verwijderen waardoor er weer een nieuwe taak gestart kan worden. Het gebruik is eenvoudig. Onderstaand een voorbeeld waarbij de standaard Magento cronjob wordt uitgevoerd met behulp van flock:

 */5 * * * * flock -xn "${TMP}cron.php.lock" php -q /var/hpwsites/<user>/website/html/webroot/cron.php >/dev/null 2>&1

Met de “-xn” parameter geeft u aan welk lock bestand er aangemaakt dient te worden. Deze moet verschillen per actieve cronjob. In bovenstaand voorbeeld gebruiken we een systeem variabele ($TMP) in combinatie met de omschrijving “cron.php.lock” wat resulteert in het aanmaken van het volgende lock-bestand “/var/hpwsites/tmp/cron.php.lock”.

Mocht u meer over flock willen weten dan kunt u, wanneer u bent ingelogd op uw HPW server, het volgende commando gebruiken om de handleiding te openen.

man flock