php - rango - ¿Cómo ejecutar un cronjob cada X minutos?
instalar crontab ubuntu (6)
2 pasos para verificar si un cronjob está funcionando:
- Inicie sesión en el servidor con el usuario que ejecuta el cronjob
-
Ejecute manualmente el comando php:
/ usr / bin / php / mydomain.in/cromail.php
Y verifique si se muestra algún error
Estoy ejecutando un script PHP en un cronjob y quiero enviar correos electrónicos cada 5 minutos
Mi actual (crontab) cronjob:
10 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
El cronmail.php es el siguiente:
<?php
$from = ''D''; // sender
$subject = ''S'';
$message = ''M'';
$message = wordwrap($message, 70);
mail("[email protected]", $subject, $message, "From: $from/n");
?>
Pero no he recibido un correo electrónico en 30 minutos con esta configuración.
En un archivo
crontab
, los campos son:
- minuto de la hora.
- hora del día
- día del mes.
- mes del año.
- día de la semana.
Entonces:
10 * * * * blah
significa ejecutar
blah
a los 10 minutos después de cada hora.
Si quieres cada cinco minutos, usa cualquiera de los siguientes:
*/5 * * * * blah
es decir, cada minuto pero solo cada quinto, o:
0,5,10,15,20,25,30,35,40,45,50,55 * * * * blah
para ejecutables
cron
más antiguos que no entienden la notación
*/x
.
Si todavía parece no funcionar después de eso, cambie el comando a algo como:
date >>/tmp/debug_cron_pax.txt
y supervise ese archivo para asegurarse de que se escriba algo cada cinco minutos.
Si es así, hay algo mal con sus scripts PHP.
Si no, hay algo mal con tu demonio
cron
.
Está configurando su cron para que se ejecute en el décimo minuto cada hora.
Para configurarlo
every 5 mins
cambie a
*/5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1
Si desea ejecutar un cron cada
n
minutos, hay algunas opciones posibles según el valor de
n
.
n
divide 60 (1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30)
Aquí, la solución es sencilla haciendo uso de la notación
/
:
# 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-59/n * * * * command
En lo anterior,
n
representa el valor
n
y
m
representa un valor menor que
n
o
*
.
Esto ejecutará el comando en los minutos
m,m+n,m+2n,...
n
NO divide 60
Si
n
no divide 60, no puede hacerlo limpiamente con cron pero es posible.
Para hacer esto, debe poner una prueba en el cron donde la prueba verifica la hora.
Esto se hace mejor cuando se mira la marca de tiempo UNIX, el total de segundos desde
1970-01-01 00:00:00 UTC
.
Digamos que queremos comenzar a ejecutar el comando la primera vez cuando Marty McFly llegó a Riverdale y luego repetirlo cada
n
minutos más tarde.
% date -d ''2015-10-21 07:28:00'' +%s
1445412480
Para que un cronjob se ejecute cada
42
minutos después de `2015-10-21 07:28:00 '', el crontab se vería así:
# 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
con
minutetestcmd
definido como
#!/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 ))
Observación: el tiempo UNIX no está influenciado por los segundos bisiestos
Observación:
cron
no tiene una precisión inferior al segundo
Su CRON debería verse así:
*/5 * * * *
CronWTF es realmente útil cuando necesita probar su configuración CRON.
Puede ser una buena idea canalizar la salida en un archivo de registro para que pueda ver si su script también arroja algún error, ya que no los verá en su terminal.
También intente usar un shebang en la parte superior de su archivo PHP, para que el sistema sepa dónde encontrar PHP. Como:
#!/usr/bin/php
de esa manera puedes llamar todo así
*/5 * * * * php /path/to/script.php > /path/to/logfile.log
# .---------------- 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
Para establecer x minutos necesitamos establecer x minutos en el primer argumento y luego la ruta de su script
Por 15 minutos
*/15 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1