web-dev-qa-db-fra.com

Comment exécuter un cronjob toutes les X minutes?

J'exécute un script PHP dans un travail cron et je veux envoyer des courriels toutes les 5 minutes

Mon cronjob actuel (crontab):

10 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1

Le cronmail.php est comme suit:

<?php
$from = 'D'; // sender
$subject = 'S';
$message = 'M';
$message = wordwrap($message, 70);
mail("[email protected]", $subject, $message, "From: $from\n");
?>

Mais je n'ai pas reçu d'email en 30 minutes avec cette configuration.

51
Savan Paun

Dans un fichier crontab, les champs sont les suivants:

  • minute de l'heure.
  • heure du jour.
  • jour du mois.
  • mois de l'année.
  • jour de la semaine.

Alors:

10 * * * * blah

signifie exécuter blah toutes les heures, à 10 minutes.

Si vous voulez toutes les cinq minutes, utilisez soit:

*/5 * * * * blah

signifiant chaque minute mais seulement chaque cinquième, ou:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * blah

pour les anciens exécutables cron qui ne comprennent pas la notation */x.

Si still semble ne plus fonctionner après cela, modifiez la commande comme suit:

date >>/tmp/debug_cron_pax.txt

et surveillez ce fichier pour vous assurer que quelque chose est écrit toutes les cinq minutes. Si tel est le cas, il y a quelque chose qui ne va pas dans vos scripts PHP. Sinon, il y a quelque chose qui ne va pas avec votre démon cron.

94
paxdiablo

Votre CRON devrait ressembler à ceci:

*/5 * * * *

CronWTF est vraiment utile lorsque vous devez tester vos paramètres CRON.

Peut-être une bonne idée de canaliser la sortie dans un fichier journal afin que vous puissiez voir si votre script génère également des erreurs, car vous ne les verrez pas dans votre terminal.

Essayez également d’utiliser un Shebang en haut de votre fichier PHP pour que le système sache où trouver PHP. Tel que:

#!/usr/bin/php

de cette façon, vous pouvez appeler le tout comme ça

*/5 * * * * php /path/to/script.php > /path/to/logfile.log

22
Gary Jones

Vous configurez votre cron pour qu'il fonctionne à la 10e minute toutes les heures.
Pour le régler sur every 5 mins changer pour */5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1

3
Justinas

2 étapes pour vérifier si une tâche cron fonctionne: 

  1. Connectez-vous sur le serveur avec l'utilisateur qui exécute le cronjob
  2. Lancer manuellement la commande php: 

    / usr/bin/php/myomain.in/cromail.php

Et vérifier si une erreur est affichée

2
Paul Giragossian
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR Sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

Pour définir x minutes, nous devons définir x minutes dans le premier argument, puis le chemin de votre script.

Pendant 15 minutes

*/15 * * * *  /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
1
Javeed Shakeel

Si vous voulez exécuter un cron toutes les n minutes, plusieurs options sont possibles en fonction de la valeur de n.

n divise 60 (1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30)

Ici, la solution est simple en utilisant la notation /:

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *   command to be executed
m/n  *  *  *  *   command

Dans ce qui précède, n représente la valeur n et m représente une valeur inférieure à n ou *. Ceci exécutera la commande aux minutes m,m+n,m+2n,...

n ne divise pas 60

Si n ne divise pas 60, vous ne pouvez pas le faire proprement avec cron mais c'est possible. Pour ce faire, vous devez placer un test dans le cron où le test vérifie l'heure. Pour ce faire, il est préférable de consulter l'horodatage UNIX, le nombre total de secondes depuis 1970-01-01 00:00:00 UTC. Supposons que nous voulions commencer à exécuter la commande la première fois que Marty McFly arrive à Riverdale, puis la répéter toutes les n minutes plus tard.

% date -d '2015-10-21 07:28:00' +%s 
1445412480

Pour qu'un cronjob soit exécuté chaque 42ème minute après `2015-10-21 07:28:00 ', le fichier crontab ressemblerait à ceci:

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *   command to be executed
  *  *  *  *  *   minutetestcmd "2015-10-21 07:28:00" 42 && command

avec minutetestcmd défini comme

#!/usr/bin/env bash
starttime=$(date -d "$1" "+%s")
# return UTC time
now=$(date "+%s")
# get the amount of minutes (using integer division to avoid lag)
minutes=$(( (now - starttime) / 60 ))
# set the modulo
modulo=$2
# do the test
(( now >= starttime )) && (( minutes % modulo == 0 ))

Remarque: le temps UNIX n'est pas influencé par des secondes intercalaires

Remarque: cron n'a pas de précision inférieure à la seconde

0
kvantour