Para mejorar nuestra productividad, uno de los aspectos a tener en cuenta es evitar en la medida de lo posible la realización de tareas repetitivas. Me refiero a aquellas tareas que tenemos que hacer cada cierto tiempo. Por ejemplo, una vez al día, o cada semana, o cada 15 días o transcurrido un periodo de tiempo determinado. Evidentemente no me refiero a no hacer las tareas, todo lo contrario, me refiero a la programación de tareas.
Los usuarios de Linux contamos con cron. Cron no es otra cosa que una utilidad que ejecuta tareas según la programación de tareas que le hayamos establecido.
En este artículo además de comentar el funcionamiento de cron para la programación de tareas, mostraré algunos ejemplos prácticos y utilidades que seguro les sacas partido.
En su día escribí algún artículo que hacía mención a cron, “como clonar ubuntu desde el terminal” o “como programar la descarga automática de Ubuntu”. Sin embargo, en ambos artículos mencionaba el uso de cron por encima.
Programación de tareas con cron
cron se gestiona a través de crontab que es un archivo de configuración donde indicaremos que es lo que se tiene que ejecutar y con que periodicidad.
Llegados a este punto, hay que tener en cuenta, que pueden haber tablas, crontab para cada uno de los usuarios del equipo, y por lo tanto también crontab para el administrador.
Para ver el contenido de nuestra programación de tareas ejecutaremos la orden,
crontab -l
si lo que queremos ver son las de administrador, ejecutaremos
sudo crontab -l
Mientras que para editar nuestra tabla de programación de tareas ejecutaremos la orden,
crontab -e
Como ayuda, he añadido a mi crontab lo siguiente,
########################################################## #minuto (0-59), # #| hora (0-23), # #| | día del mes (1-31), # #| | | mes (1-12), # #| | | | día de la semana (0-6 donde 0=Domingo) # #| | | | | comandos # ##########################################################
De esta manera tenemos una idea clara de donde tiene que ir cada cosa…
Por otro lado, si queremos hacer una copia de seguridad de nuestra tabla de programación, solo tenemos que ejecutar la siguiente orden,
crontab -l > copia-de-seguridad.txt
Mientras que para eliminar nuestra tabla de programación, solo tendremos que ejecutar la orden,
crontab -r
Por ejemplo, si queremos realizar una captura de pantalla todos los días a las 13:00, añadiremos la siguiente orden a nuestro crontab,
0 13 * * * scrot -b -d 1 '%Y:%m:%d:%H:%M:%S.png' -e 'mv $f ~/Escritorio/'
Una utilidad interesante es sincronizar nuestro directorio local con un directorio remoto a una hora determinada. Por ejemplo, todos los días a las 12:00
0 12 * * * rsync -avz /home/lorenzo/datos/ 192.168.1.50:/home/lorenzo/datos
También podemos indicar mas de una hora, por ejemplo
0 6,12,18 * * * rsync -avz /home/lorenzo/datos/ 192.168.1.50:/home/lorenzo/datos
Nos haría la sincronización a las seis de la mañana, a las 12 y a las seis de la tardes.
Otra opción interesante es indicar un intervalo, por ejemplo, si queremos que la sincronización solo se realice de lunes a viernes le diríamos,
0 6,12,18 * * 1-5 rsync -avz /home/lorenzo/datos/ 192.168.1.50:/home/lorenzo/datos
De esta manera la sincronización sería de lunes (1) a viernes (5), a las 6, a las 12 y a las 18 horas. Indicar que el domingo es el 0.
Ahora, ¿y si queremos realizar la programación de tareas en lugar de a una hora determinada cada 15 minutos por ejemplo? Vamos a guardar la temperatura de nuestra CPU en un archivo para consultarlo posteriormente,
* */15 * * * cat /sys/class/thermal/thermal_zone0/temp >> /home/lorenzo/temperaturas.log
A parte de la programación de tareas que hemos visto, también, existen algunas definiciones establecidas. Que son las siguientes,
- @yearly, equivale a
0 0 1 1 *
esto es que la tarea se ejecutará una vez al año. En concreto el 1 de enero a las 0:00 (medianoche). - @monthly, equivale a
0 0 1 * *
. La tarea se ejecutará una vez al mes. En particular se ejecutará el primer día del mes a las 0:00 (medianoche). - @weekly, equivale a
0 0 * * 0
. La tarea se ejecutará una vez a la semana. En particular se ejecutará el domingo a las 0:00 (medianoche). - @daily, equivale a
0 0 * * *
. La tarea se ejecutará una vez al día. Exactamente a las 0:00 (medianoche). - @hourly, equivale a
0 * * * *
. La tarea se ejecutará al comienzo de cada hora. - @reboot, se ejecuta en el arranque. Esta es quizá la mas interesante de las definiciones establecidas, puesto que no se puede realizar de otra manera, y nos permite ejecutar acciones cuando arranca la máquina.
Quedaría pendiente la opción de la programación de tareas al apagar el equipo. Creo que esta opción es realmente muy interesante y le será de gran ayuda a mas de uno, así que la trataré en un próximo artículo.
Si queremos comprobar que cron está funcionando correctamente, ejecutaremos la siguiente orden en un emulador de terminal
cat /var/log/syslog | grep -i cron
Algunos ejemplos de programación de tareas
A continuación verás algunos ejemplos de programación de tareas para que te hagas una idea de las opciones y posibilidades que este sistema te ofrece,
1.- Programación de una copia de seguridad todos los años el 10 de junio a las 8:30
30 08 10 06 * /home/lorenzo/copia-de-seguridad.sh
2.- Realizar la copia de seguridad a las 10:00 y a las 20:00 todos los días de la semana
00 10,20 * * * /home/lorenzo/copia-de-seguridad.sh
3.- La copia de seguridad la haremos cada hora entre las 8:00 y las 18:00 pero solo los días laborables (de lunes a viernes)
00 08-18 * * 1-5 /home/lorenzo/copia-de-seguridad.sh
4.- En este caso la copia de seguridad la realizaremos cada 15 minutos entre las 8:00 y las 18:00 y de lunes a viernes
*/15 08-18 * * 1-5 /home/lorenzo/copia-de-seguridad.sh
5.- Ejecutar una tarea el primer domingo de cada mes. Esto es algo mas complicado porque no se puede indicar claramente vía cron. Sin embargo se puede poner un condicional,
0 8 * * 0 [ $(date +%d) -le 07 ] && /home/lorenzo/copia-de-seguridad.sh
6.- Ejecutar una tarea cada 30 segundos. Esto tampoco se puede definir mediante la programación de tareas de cron, pero hay una solución,
* * * * * /home/lorenzo/copia-de-seguridad.sh * * * * * sleep 30; /home/lorenzo/copia-de-seguridad.sh
7.- Ejecutar varias tareas en un momento determinado. Esto ya lo hemos adelantado en el punto anterior, y es que para ejecutar varias tareas solo tenemos que separarlas mediante punto y coma
*/15 * * * * script1.sh; script2.sh; script3.sh
Más información,
Gracias por el tutorial.
Hace tiempo venía pensando (como simple idea) en ver si habría alguna forma rudimentaria de programar un script para que me cambie cada día el icono de la aplicación de calendario que tengo (Orage). Me doy cuenta de que lo mejor es hacer un script que cambe de icono y luego programar para ejecutar el script desde crontab.
De hecho, buscando un poco más me doy cuenta que en Numix ya habían pensado en eso y lo han llevado a cabo. 😀
https://github.com/numixproject/numix-calendar-icons
Me gusta la idea y la voy a poner en marcha, es una solución muy interesante.
Gracias.
Gracias por este tutorial.
Muchas gracias.
disculpa, intento hacer una prueba que me pase la fecha a un .txt pero no ejecuta el crontab, pero si lo ejecuto por consola si pasa la fecha al .txt, no se que este mal de cron.