Crontab, tareas programadas en Linux
Hoy aprenderemos a planificar tareas o ejecución de comandos en nuestro sistema Linux mediante el uso de su principal herramienta a tal propósito: crontab.
Entre muchas de las tareas cotidianas de un sysadmin se encuentra la de planificación de la ejecución de algún comando, script, binario, etc.
Dado que una buena parte de las actividades requieren ejecutar comandos o scripts periódicamente, y dado también que un sysadmin casi por naturaleza prefiere realizar las tareas con el menor esfuerzo posible, es una gran ventaja en GNU/Linux poseer herramientas como crontab que nos permitan planificar ejecuciones futuras y periódicas de ciertas actividades.
Funcionamiento
Crontab es un daemos, o proceso residente en nuestro sistema GNU/Linux, que cada minuto verifica los archivos de configuración de tareas planificadas, y ejecuta las tareas cuya estampa de tiempo coincida con la hora actual del chequeo.
En el caso de Debian GNU/Linux, los archivos de configuración que serán verificados son:
/etc/crontab /var/spool/cron/contabs/<username>
Donde <username> representa un nombre de usuario que ha planificado tareas.
Crontab, el comando
El comando crontab es el que le permite a un usuario del sistema planificar tarea de ejecución en alguna estampa de tiempo.
Cada usuario podrá, por defecto, planificar tareas en el sistema, siempre y cuando posea los privilegios suficientes para ejecutar dichas tareas.
Cualquier usuario del sistema podrá verificar su lista de tareas con el siguiente comando:
crontab -l
A su vez, podrá planificar tareas escribiendo una línea de crontab utilizando el siguiente comando:
crontab -e
Este comando abrirá, por terminal, el editor de textos predeterminado, y le permitirá al usuario escribir, al final, las líneas de planificación.
La sintaxis de la línea de planificación.
Cuando un usuario va a planificar una tarea determinada, deberá agregarla en el siguiente formato al final de su archivo de planificación:
mins hour dayOfMonth Month DayOfWeek Command 0-59 0-59 1-31 1-12 0-6 (0=dom) commando
El primer campo corresponde a un número de minuto. El segundo al número de hora. Luego el día del mes y el mes. Por último en día de la semana, y el comando a ejecutar.
Cada uno de los parámetros se irán seteando con un número dentro del rango especificado arriba, o mediante un comodín como * cuando no nos interesa fijar dicho parámetro.
Cuando el chequeo del cron encuentre que la hora actual del sistema coincide con la línea de crontab, ejecutará el comando en cuestión.
A medida que más parámetros configuremos, más «condiciones» deberán verificarse para la ejecución de un comando, y por consiguiente, el período de ejecución será más extenso.
Veamos algunos ejemplos
17 * * * * tarea1 17 03 * * * tarea2 17 03 25 * * tarea3 17 03 25 05 0 tarea4 17 03 * * 2 tarea5
Aquí:
- La tarea1 se ejecutará una vez por hora, justo cuando la hora marque el minuto 17.
- La tarea2 se ejecutará una vez por día a las 3.17 de la madrugada.
- La tarea3 se ejecutará una vez por mes, el día 25 de cada mes, a las 3.17 de la madrugada.
- La tarea4 se ejecutará una vez por año, el 25 de mayo de cada año, a las 3.17hs de la madrugada, siempre y cuando ese día sea domingo.
- La tarea5 se ejecutará una vez por semana, los martes a las 3.17 de la madrugada.
Uso de ‘/’
Podremos utilizar la ‘/’ para establecer algunos tiempos especiales. Veamos los siguientes ejemplos:
17 03 0-31/3 * * tarea6 0-45/8 17 * * * tarea7 * */8 * * 5 tarea8
- La tarea6 se ejecutará a las 3.17 de la mañana, cada 3 días.
- La tarea7 se ejecutará a cada 8 minutos durante los primeros 45 minutos de la hora 17 cada día.
- La tarea8 se ejecutará cada 8 horas los días jueves.
Espero que les sean de utilidad estos ejemplos prácticos para entender la forma de planificación de tareas de crontab!
Algunos comodines
En la sección de estampa de tiempo se pueden colocar algunos comodines que permiten realizar diferentes tareas. Aquí un breve resumen de ellos:
- @reboot: corre el comando al iniciar el sistema operativo
- @yearly o @annually: corre el comando una vez por año en el timestamp «0 0 1 1 *»
- El 1 de enero a las 00:00
- @monthly: corre el comando una vez por mes en el timestamp «0 0 1 * *»
- El 1 de cada mes a las 00:00
- @weekly: corre el comando una vez por semana en el timestamp «0 0 * * 0»
- cada domingo a las 00:00
- @daily o @midnight: corre el comando una vez por día en el timestamp «0 0 * * *»
- a las 00:00 de cada día
- @hourly: corre el comando una vez por hora en el timestamp «0 * * * *»
- al minuto 0 de cada hora
NOTA: cambiando el editor predeterminado
Para cambiar el editor de textos predeterminado de terminal, podemos utilizar el siguiente comando:
update-alternatives –config editor
Cuya salida será algo similar a la liguiente:
die@tuta2:~$ update-alternatives --config editor There are 6 choices for the alternative editor (providing /usr/bin/editor). Selection Path Priority Status ------------------------------------------------------------ 0 /usr/bin/vim.gtk 50 auto mode 1 /bin/nano 40 manual mode 2 /usr/bin/emacs23 0 manual mode 3 /usr/bin/mcedit 25 manual mode * 4 /usr/bin/vim.basic 30 manual mode 5 /usr/bin/vim.gtk 50 manual mode 6 /usr/bin/vim.tiny 10 manual mode Press enter to keep the current choice[*], or type selection number: _
En este caso, mi editor predeterminado es el Vim 🙂
Pueden escribir el número de la opción que deseen.
Otros planificadores
Cabe aclarar que crontab no es la única opción para planificación de tareas.
Anacrontab también es una herramienta que complementa el funcionamiento de crontab mediante verificación de ejecución de tareas. Crontab, si en el momento en el que debe ejecutar la tarea, se encuentra apagado, o el sistema se encuentra apagado, nunca ejecutará esa tarea, hasta la siguiente estampa de tiempo planificada. Anacrontab cubre esta «carencia», aunque con menor granularidad horaria.
at también es un comando de planificación de tareas más simle y orientado a ejecuciones únicas.
Espero les sea útil!
¿Conoces alguna otra herramienta? Estás invitado a comentar este artículo!
Hasta la próxima!
3 comentarios
Repa · 10 febrero, 2017 a las 12:29
Muy util, gracias!!
Diego Cordoba - @d1cor · 10 febrero, 2017 a las 19:05
Muchas gracias Martín! Genial que te haya servido!
Diego Cordoba - @d1cor · 12 junio, 2017 a las 20:00
Fede! lo de la tarea 3 fue un error de typeo, ahí está corregido. Sí, el mes debe ser 1-12, o en su defecto, * o algún otro comodín.
Por lo de la tarea4, tenés razón, solo se ejecuta cuando es domingo (0 en el día de la semana). Está actualizado eso también.
Gracias por tus aportaciones!
Abz!
Los comentarios están cerrados.