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.
Dans un fichier crontab
, les champs sont les suivants:
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
.
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
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
2 étapes pour vérifier si une tâche cron fonctionne:
Lancer manuellement la commande php:
/ usr/bin/php/myomain.in/cromail.php
Et vérifier si une erreur est affichée
# .---------------- 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
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