Programar Tareas en Linux Usando Crontab
Programar Tareas en Linux Usando Crontab. Hoy voy a enseñarles a usar una herramienta muy útil, llamada Cron, que sirve para programar y automatizar tareas en Linux. Hay que saber aprovechar este tipo de funciones que nos ofrece. Si queremos, por ejemplo, que cada hora se ejecute un script, o un archivo PHP, o cualquier cosa que queramos, pues no vamos a meternos 24 veces al día para ejecutarlo manualmente. No tiene sentido. Para esto está Cron.
Sobre CRONTAB
El comando crontab se utiliza en sistemas UNIX para programar la ejecución de otros comandos, es decir, para automatizar tareas. Podemos ver los crontabs que se están programados y también editarlos, lógicamente.
Para verlos, utilizamos este comando:
$ sudo crontab -l
Para editar la lista de cronjobs que puede ejecutar:
$ sudo crontab -e
FORMATO DE LAS TAREAS
Las tareas cron siguen una determinada sintaxis. Tienen 5 asteriscos seguidos del comando a ejecutar. Ahora explicaré para qué sirve cada cosa.
* * * * * /bin/execute/this/script.sh
Los 5 asteriscos
De izquierda a derecha, los asteriscos representan:
- Minutos: de 0 a 59.
- Horas: de 0 a 23.
- Día del mes: de 1 a 31.
- Mes: de 1 a 12.
Día de la semana: de 0 a 6, siendo 0 el domingo.
Si se deja un asterisco, quiere decir "cada" minuto, hora, día de mes, mes o día de la semana. Por ejemplo:
* * * * * /bin/ejecutar/script.sh
Ejecuta este script:
- Cada minuto
- De cada hora
- De cada día del mes
- De cada mes
- De cada día de la semana
Otro ejemplo:
30 2 * * 1 /bin/ejecutar/script.sh
Ejecutar este script:
- En el minuto 30
- De las 2 de la noche
- De cada día del mes
- De cada mes
- Sólo si es viernes
En resumen, todos los viernes a las 2:30 horas se ejecutará el script.
Intervalos de tiempo
Ejecutar un script de lunes a viernes a las 2:30 horas:
0,10,20,30,40,50 * * * * /bin/execute/this/script.sh
Pero Crontab le permite hacer esto también:
*/10 * * * * /bin/execute/this/script.sh
Lo cual hará exactamente lo mismo. ¿Puedes hacer las matemáticas? ; )
Palabras especiales
Para el primer campo (minuto), también puede poner una palabra clave en lugar de un número:
@reboot Run once, at startup
@yearly Run once a year "0 0 1 1 *"
@annually (same as @yearly)
@monthly Run once a month "0 0 1 * *"
@weekly Run once a week "0 0 * * 0"
@daily Run once a day "0 0 * * *"
@midnight (same as @daily)
@hourly Run once an hour "0 * * * *"
Dejando el resto de los campos vacíos, esto sería válido:
@daily /bin/execute/this/script.sh
Almacenamiento de la salida de crontab
De forma predeterminada, cron guarda la salida de /bin/execute/this/script.sh
en el buzón del usuario (root en este caso). Pero es más bonito si la salida se guarda en un archivo de registro separado. Así es cómo:
*/10 * * * * /bin/execute/this/script.sh >> /var/log/script_output.log 2>&1
Mayor información
Linux puede informar en diferentes niveles. Hay salida estándar (STDOUT) y errores estándar (STDERR). STDOUT está marcado 1, STDERR está marcado 2. Así que la siguiente declaración le dice a Linux que almacene STDERR en STDOUT también, creando un flujo de datos para mensajes y errores:
2>&1
Ahora que tenemos 1 flujo de salida, podemos verterlo en un archivo. Donde >
sobreescribirá el archivo, >>
agregará al archivo. En este caso, nos gustaría agregar:
>> /var/log/script_output.log
Envío por correo de la salida de crontab
De forma predeterminada, cron guarda la salida en el buzón del usuario (root en este caso) en el sistema local. Pero también puede configurar crontab para reenviar todos los resultados a una dirección de correo electrónico real al iniciar su crontab con la siguiente línea:
MAILTO="Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo."
Enviar por correo la salida de crontab de solo un cronjob
Si prefiere recibir solo una salida de cronjob en su correo, asegúrese de que este paquete esté instalado:
$ aptitude install mailx
Y cambie el cronjob así:
*/10 * * * * /bin/execute/this/script.sh 2>&1 | mail -s "Cronjob ouput" Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.
Trasladar la salida de crontab
Ahora que es fácil:
*/10 * * * * /bin/execute/this/script.sh > /dev/null 2>&1
Simplemente canalice toda la salida al dispositivo nulo, también conocido como agujero negro. En sistemas operativos tipo Unix, /dev/null
es un archivo especial que descarta todos los datos escritos en él.
Advertencias
Muchos scripts se prueban en un entorno Bash con la variable PATH
configurada. De esta manera, es posible que las secuencias de comandos funcionen en su caparazón, pero cuando se ejecuta desde cron (donde la variable PATH
es diferente), la secuencia de comandos no puede encontrar ejecutables referenciados y falla.
No es tarea del script establecer PATH
, es responsabilidad de la persona que llama, por lo que puede ayudar a echo $PATH
y colocar PATH=<the result>
en la parte superior de los archivos cron (justo debajo de MAILTO
).