Drupal cronjobs of andere functies uitvoeren via drush en crontab

Ingediend door Donny op di, 19/02/2013 - 07:30

Tijdens het lopen van cron op je Drupal website dienen er verschillende taken te worden uitgevoerd. Afhankelijk van je project dienen sommige taken sneller en meer te lopen dan andere, bijvoorbeeld als je werkt aan een nieuws website waar regelmatig nieuwe inhoud op wordt aangemaakt of binnenkomt via RSS feeds, dan wil je natuurlijk ook graag dat deze zo snel mogelijk wordt opgenomen in je zoekindex.

Je zou dan cron kunnen instellen om elk half uur te lopen, maar tijdens het lopen van cron worden natuurlijk ook andere taken afgehandeld en daar cron maar een beperkte tijd heeft om zijn jobs uit te voeren kan het mogelijk zijn dat niet altijd alle taken binnen dezelfde run worden uitgevoerd.

Een mogelijke optie is dan om de cronjobs op te gaan splitsen mbv modules zoals de Elysia cron module. Als het echter gaat om enkele specifieke taken dan is het soms wel eenvoudiger om deze via Drush en Crontab te laten uitvoeren.

Op de meeste projecten maak ik gebruik van de scheduler module om klanten zo te laten opgeven wanneer een node mag gepubliceerd of gedepubliceerd worden. Enkel hiervoor een extra module installeren om cronjobs te gaan verdelen lijkt mij wat te veel van het goede en zou meer tijd vragen om dit in te stellen dan het toe te voegen aan crontab en te laten uitvoeren door Drush.

Via Drush kan je niet alleen de voorziene Drush commando's uitvoeren, maar ook alle andere PHP (Drupal) functies die zijn opgenomen in Drupal core of modules. Als we voor het schedulen van nodes de scheduler.module even nakijken dan zien we dat deze de functie scheduler_cron() bevat, deze wordt opgeroepen tijdens cron en zal de tabel met de te publiceren of depubliceren nodes afgaan.

Indien er voor de functie geen commando is voorzien kan je dit uitvoeren via het Drush php-eval commando.

drush php-eval 'scheduler_cron();'

Bovenstaand commando uitvoeren zou dus kijken voor het publiceren of depubliceren van nodes.

We kunnen dit via crontab laten uitvoeren als volgt, open eerst crontab als volgt:

crontab -e

Daarna kunnen we de regel toevoegen (Werkt hetzelfde als vim-editor)

*/10 * * * * cd /pad_naar_jouw_website_root; drush php-eval 'scheduler_cron();'

Bovenstaande regel zou dus elke 10 minuten worden uitgevoerd.

Dit is slechts een voorbeeld, je kan hier allerlei functies laten uitvoeren, denk bijvoorbeeld aan het controleren van nieuwe inhoud op RSS feeds, het indexeren van je nodes voor de zoekmodule (Apache solr of Drupal core search).

Indien je de functie kan uitvoeren via de commandline maar dat crontab dat niet doet, kijk dan eerst naar het opgegeven tijdstip of dit wel correct is. Als het probleem daarmee nog niet opgelost is bekijk dan zeker even de blogpost Gebruik drush cron vanuit crontab van Dominique De Cooman.