Ejecutar scripts automáticamente con Cron

Cron es un programa, ejecutado a través de la línea de comandos, que hace que la ejecución de otros programas se haga cada cierto tiempo. Puede ser cada día, cada hora, o más específicamente, cada 2 días, 3 horas y 45 minutos, por poner un ejemplo.

Normalmente se usa para programar ciertas tareas repetitivas, como puede ser una copia de respaldo de una base de datos o envíos de correos a usuarios.

¿Cómo se puede usar?

Pues es bien sencillo, quizá hay un detalle importante y es que debe ejecutarse en el servidor donde tengamos alojada nuestra página. Además debemos tener claro que por lo que desempeña es un demon, que se está siempre ejecutando, vamos.

Normalmente está iniciado por defecto, y se estará ejecutando si estás usando un sistema Unix/Linux, (sí, también se incluye Mac, al ser Unix). De todas formas para saber si se está ejecutando escribe lo siguiente en la línea de comandos:

1
ps aux | grep crond

Y debería mostrar una línea, con crond, si no la ves, tienes que añadir crond al comienzo de la ejecución, para que se ejecute siempre que se encienda el ordenador, esto depende del sistema operativo, pero normalmente ya lo tendrás funcionando, así que no te preocupes.

Edición del crontab

Crontab es el nombre que se le da a un archivo donde se especifica de una forma que ahora veremos los programas / scripts que se van a ejecutar y cada cuánto tiempo. Para editarlo solo tienes que ejecutar:

1
crontab -e

La sintaxis es la siguiente:

1
2
minutos  horas  día_del_mes  mes   dia_de_la_semana <comando>
(0-59)   (0-23)   (1-31)    (1-12)      (0-6)

Hay que tener en cuenta que la semana empieza en Domingo, así que 0 en el día de la semana será cada Domingo. De todas formas veamos algún ejemplo para que quede claro:

Cada día a una hora determinada (23:15)

1
15 23 * * * <comando>

Cada mes (día 25) a una hora determinada (20:00)

1
0 20 25 * * <comando>

Los viernes a las 15:00

1
0 15 * * 5 <comando>

Valores predefinidos

En esta tabla de la wikipedia se puede ver la serie de valores predefinidos para facilitarnos un poco la vida.

Tabla Cron Valores Predefinidos

Cada vez que reiniciemos el servidor

1
@reboot <comando>

Y podríamos hacer muchos más, lo que hay que tener claro es una regla sencilla, lo que se quede con asterisco, se hará cada vez que el campo especifica, es decir si dejamos con asterisco los minutos se hará todos los minutos, si dejamos las horas se hará todas las horas.

Por supuesto los días del mes y de la semana entran en conflicto, es decir que si especificas uno, pues el asterisco del otro no se toma como “todos”, por ejemplo:

1
0 10 20 2 0 <comando>

Esto se ejecutará Los días 20 de Febrero a las 10:00 que sean Domingos, es decir que no será todo los años, solo los años en que el 20 de Febrero caiga en Domingo. Así que hay que tener cuidado.

Uso con script de PHP

Veo necesario mostar un ejemplo con PHP, que hará que se ejecute cada cierto tiempo teniendo la salida en otro archivo (log) para controlar lo que pasa. En primer lugar editamos un archivo php (ejemplo.php):

1
2
3
4
5
6
<?php
$fecha = date('d \d\e\l m \d\e Y \a \l\a\s H:i');
echo "Ejecutado el " . $fecha . "\n";	
 
//Salida: Ejecutado el 01 del 07 de 2010 a las 16:35
?>

Como puedes ver depende de la hora y fecha en la que estemos así para cada minuto tendremos una salida distinta. Es sólo un ejemplo, pero podría ser un backup de una base de datos o el envío de 500 correos con un mensaje de salida.

Ahora, para ejecutarlo, tenemos que tener claro que los scripts de PHP no son ejecutables si PHP está en modo CGI en el servidor, que suele pasar, por tanto tenemos que buscar el comando que los ejecuta, para ello en el terminal ponemos:

1
which php

En mi caso es /usr/bin/php, así que el comando a ejecutar por el cron será:

1
/usr/bin/php /ruta/a/script/ejemplo.php

Además queremos tener la salida en un archivo log:

1
/usr/bin/php /ruta/a/script/ejemplo.php >> /ruta/a/logs/log.txt

Por tanto cuando ejecutando esto en el terminal a mano cada minuto obtenemos un archivo con algo como:

1
2
3
4
Ejecutado el 01 del 07 de 2010 a las 16:57
Ejecutado el 01 del 07 de 2010 a las 16:58
Ejecutado el 01 del 07 de 2010 a las 16:59
Ejecutado el 01 del 07 de 2010 a las 17:00

Pues bien una vez que tenemos nuestro comando funcionando lo único que tenemos que hacer es editar el crontab para que se ejecute el solo. Para ello ejecutamos crontab -e, como hemos dicho antes y llegaremos a un editor de texto en terminal, allí pondremos:

1
2
3
4
# esto es un comentario
 
# script de prueba
15 15 * * * /usr/bin/php /ruta/a/script/ejemplo.php >> /ruta/a/logs/log.txt

Esto se ejecutará todos los días a las 15:15, así que el log se irá llenando poco a poco, una línea por día.

Interfaces de Usuario para Cron

Además de editar el archivo a mano hay una serie de interfaces, normalmente de las propias compañías de Hosting, que facilitan la tarea con un menú. Pero no siempre tenemos estas herramientas así que es mejor aprenderse bien la sintaxis y si luego las tenemos pues mejor. Esta imagen corresponde al panel que hay en Dreamhost.

Cron en Dreamhost

Conclusión

Cron es una herramienta muy útil, como has podido ver, y además se usa a día de hoy en casi todos los servidores del mundo para hacer tareas de mantenimiento o de la propia aplicación web que está funcionando allí. Aquí dejo un par de enlaces para más información: