Utiliza Cron y Crontab para programar tareas en tu servidor

Utiliza Cron y Crontab para programar tareas en tu servidor

Sergio De Luz

¿Alguna vez has intentado programar una tarea repetitiva en tu servidor Linux y no has sabido cómo hacerlo? Las herramientas cron y crontab que están disponibles de forma predeterminada en sistemas Linux te permitirán realizar una determinada tarea (o varias) en un determinado tiempo, y es que vamos a ser capaz de programar con una exactitud de minutos qué queremos ejecutar y cuándo lo queremos ejecutar. Hoy en RedesZone os vamos a explicar en detalle cómo funciona tanto Cron como Crontab, para que administres correctamente tus servidores.

Estos dos elementos son muy importantes a la hora de programar tareas periódicas y que se ejecuten sin que tengamos que estar pendientes de su estado. Nos va a permitir despreocuparnos de ejecutar algo en un determinado momento, dejándolo completamente automático en el sistema operativo. Hemos mencionado con anterioridad Cron y Crontab. En primer lugar, vamos a ver qué diferencias existen entre ambos elementos. Posteriormente aprenderemos a agregar tareas, y para finalizar, nos adentraremos en la gestión de los jobs (trabajos) de Cron. Aprenderás todo lo necesario para poder utilizarlos.

Diferencias entre Cron y Crontab

Aunque pueda parecer que estamos hablando de lo mismo, no es así, y se podrían considerar dos elementos dependientes uno del otro. Para ser más claros, son los encargados de que la programación de tareas en sistemas Linux sea posible. Actualmente cualquier sistema operativo basado en Linux dispone de ambas herramientas, con el objetivo de programar las diferentes tareas de forma repetitiva sin que nosotros nos tengamos que encargar de ello.

Por tanto, si necesitas que se ejecute algo determinado en una hora concreta, cada día, cada semana, cada mes… Vas a poder utilizar estas dos herramientas que están disponibles en Linux. No importa qué distribución tengas instalada, ya que es compatible con todas ellas.

Qué es Cron

Cron es un demonio (que es como se conoce a un proceso en segundo plano) que se ejecuta desde el mismo instante en el que arranca el sistema operativo. Cron se encargará de comprobar si existe alguna tarea (job) para ser ejecutada, de acuerdo a la hora configurada en el propio sistema operativo. Es muy importante que la hora esté bien configurada, y también la zona horaria, de lo contrario, las ejecuciones que realice Cron no se corresponderán con nuestras configuraciones.

Para garantizar que nuestro sistema operativo esté configurado correctamente, es muy importante que obtenga la hora automáticamente de los servidores NTP (Network Time Protocol) que existen. Para comprobar que tenemos la hora correcta en nuestro sistema operativo, en qué zona horaria estamos y si el reloj del sistema está correctamente sincronizado con los servidores NTP, podemos ejecutar la siguiente orden:

timedatectl

Deberíamos ver algo como lo siguiente:

Tal y como se puede ver, todas las horas cuadran perfectamente y el tiempo es el correcto, esto es muy importante, de lo contrario, los «Cron» se ejecutarán en horas donde no deberían ejecutarse. Habría un problema si el sistema está mal configurado y coge una hora que no corresponde. En el caso de que no tengamos la zona horaria bien configurada, podremos configurarla de forma correcta con la siguiente orden:

timedatectl set-timezone Europe/Madrid

Con la instalación del sistema operativo Linux, se configuran de forma automática los servidores NTP que nosotros queramos, en caso de fallo o que queramos cambiar estos servidores NTP, podremos hacerlo instalando el correspondiente servicio y configurándolo en /etc/ntp.conf.

En función de la distribución, Cron se inicia utilizando las carpetas /etc/rc.d/ o /etc/init.d y cada minuto comprueba los ficheros /etc/crontab/var/spool/cron en busca de posibles ejecuciones que hayamos programado. Con esto podremos automatizar muchos procesos, agregando nuevos comandos o scripts con tareas a cron. Nos resultará muy útil, por ejemplo, par automatizar actualizaciones de los sistemas o para tener un protocolo de respaldo. Pero estas deben estar siempre escritas en un fichero Contrab.

Puede tener diferentes valores, según sea el periodo de tiempo en el que va a ejecutar una acción. Por ejemplo hacer algo cada hora, cada día, cada semana, siempre a un momento concreto del día, etc. Todo esto lo vas a poder configurar y programar para evitar que algo no se ejecute correctamente. Lo que va a hacer es revisarlo siempre que llegue el momento exacto.

Qué es Crontab

Crontab es un archivo de texto, se trata de un archivo con un contenido especial y específicamente diseñado para que sea leído correctamente por Cron y proceder con la ejecución que nosotros hayamos programado. Crontab posee una lista con todos los scripts a ejecutar, generalmente cada usuario del sistema posee su propio fichero Crontab, de esta forma, cada usuario podría programar sus propias tareas repetitivas independientemente, sin necesidad de que siempre tengamos que acudir al usuario administrador. De esta forma, cualquier usuario (incluyendo los administradores) podrán programar tareas repetitivas para realizar diferentes ejecuciones. Por esto mismo, será muy útil para hacer un seguimiento y verificar que se cumplen las tareas como pueden ser las actualizaciones, sincronización o edición del estado de los contenidos como eliminar ciertos apartados.

Para generar el archivo propio, cada usuario deberá hacer uso del comando «crontab» (sí, es el mismo nombre que la propia herramienta). Se utiliza mucho para poder ejecutar y administrar tareas de Cron en un sistema.

Con Crontab, como vas a ver, podrás configurar el archivo según unos parámetros establecidos. Podrás poner un tiempo exacto para que ejecute la acción (o múltiples tareas). Su nombre, como en el caso de Cronos, viene de la palabra griega «tiempo», por lo que esa va a ser la clave de su funcionamiento.

Agregar tareas a Crontab

Partiendo de que podemos ejecutar tareas, en primer lugar, vamos a configurar un script muy sencillo que llamaremos consulta.sh, pondremos en nuestro «Escritorio» o en «Documentos» este script, podremos ejecutar directamente el editor de texto «nano» en la ubicación donde queramos ponerlo:

nano consulta.sh

El contenido del script sería el siguiente:

#!/bin/bash

#script de ejemplo

sudo ls -l / > archivoResultado.txt

Una vez que hayamos programado el script, que básicamente es un programa que lista los archivos y directorios del directorio actual, y lo exporta a un archivo de texto, tenemos que darle permisos de ejecución para poder ejecutarlo correctamente por parte de Cron, de lo contrario no tendrá permisos de ejecución:

chmod ugo+x consulta.sh

Este aspecto es muy importante, ya que de lo contrario el comando nunca será ejecutado.

Ha llegado el momento de editar el fichero que posee las tareas. Para ello nos vamos a ayudar del comando crontab -e. Nos encontramos la siguiente estructura:

linux-cron-crontab-anadir-tareas-periodicas

5 asteriscos y el comando a ejecutar. Cada uno de los 5 asteriscos significa:

  • m: minuto
  • h: hora
  • dom: día del mes
  • mon: mes
  • dow: día de la semana

Lo valores que pueden adoptar cada una de estas variables se encuentran en la imagen. Por ejemplo, en el caso del último, se permite la utilización del nombre de los días escritos en inglés. Aunque en la imagen anterior no aparezca, es necesario indicar entre el comando y el último asterisco (el día) el propietario del archivo para que funcione correctamente.

Para que quede todo claro, vamos a utilizar algunos ejemplos:

Si queremos ejecutar el script de consulta.sh todos los días a las 7 de la tarde, tendremos que indicar una línea en el crontab con lo siguiente:

00 19 * * * usuario /ubicacion/del/script/consulta.sh

Si queremos ejecutar todos los domingos a las 7 de la tarde:

00 19 * * 0 usuario /ubicacion/del/script/consulta.sh

Ejecutar el script todos los 4 de febrero a las 7 de la tarde:

00 19 4 2 * usuario /ubicacion/del/script/consulta.sh

Hay que decir que en Linux existen algunas cadenas de texto reservadas para ejecutar procesos durante determinados periodos en el propio Crontab, esto nos será de mucha ayuda:

  • @reboot: Ejecuta una vez y nada más iniciarse el equipo.
  • @yearly: ejecuta sólo una vez al año: 0 0 1 1 *
  • @monthly: ejecuta una vez al mes y el primer día: 0 0 1 * *
  • @weekly: todas las semanas, el primer minuto de la primera hora de la semana: 0 0 * * 0.
  • @daily: todos los días a las 12 de la noche: 0 0 * * *
  • @midnight: Tiene el mismo efecto que el anterior.
  • @hourly: todas las horas durante su primer minuto: 0 * * * *

Aunque os hemos puesto cuál sería el formato, al hacer uso de crontab -e se pueden utilizar estos términos para definir el periodo. Puede que necesites que se ejecute cada hora, cada día, cada semana, cada mes… En definitiva, cualquiera de estas opciones vas a tener disponibles.

Caracteres especiales

Como has podido ver, las posibilidades a la hora de establecer nuevas tareas se pueden utilizar muchos caracteres diferentes. Para ello podemos utilizar algunos modificadores, los cuales nos dan mucho más poder de crear nuevas reglas. Lo cual aumenta las posibilidades para poder crear procesos mucho más complejos, y como tal más precisos. Estos son

  • *: Tiene el mismo significado que asignar todos los valores.
  • ,:  Nos da un listado de valores.
  • -: Establece un rango de calores.
  • /: Significa «cada».
  • rango / excep: Crea excepciones en la regla.

Otro símbolo que es imprescindible en el día a día de crear reglas, es la almohadilla #. La cual será utilizada al comienzo de las líneas para indicar que estamos escribiendo tan solo un comentario. Esto puede servir para dejar algunas aclaraciones de como se hace algo, o para que sirve. Pero en general podemos escribir lo que queramos. En ese caso, esta no se tendrá en cuanta para la ejecución de la orden. Ocurre lo mismo que con los demás lenguajes de programación, donde siempre podremos establecer comentarios para dejar algún tipo de aclaración.

Una vez sabemos todo esto, ya podremos empezar a crear nuestras propias reglas. Pero es probable que, si queremos hacer alguna muy compleja, sea necesario tener algunos conocimientos de programación. Sobre todo, para comprender la estructura de cómo se va a ejecutar alguna tarea concreta. Y en caso de que falle, sabes donde se puede estar produciendo el problema en cuestión.

Otras posibles tareas con Crontab

En este apartado, es posible hacer nuevos apartados y subapartados, pues no se limita a unas pocas opciones. Por ejemplo podemos ver cuales son los crontabs que se ejecutan en tiempo real como los siguientes:

  • Eliminar archivos y directorios vacíos. Esta tarea puede ser programada de forma muy personalizada.
  • Ejecución de múltiples tareas. Nos permite ejecutar varias tareas o trabajos, pero siempre de forma separada.

Y también es posible generar cadenas especiales de Crontab, como por ejemplo la ejecución de tareas de forma anual o mensual. Esto puede configurarse de forma que se ejecute en el minuto uno del año, pero en todo caso es posible realizar configuraciones muy variadas, todo de la mano de la programación que se realice con el comando.

Administración de los jobs del Cron

El funcionamiento de Crontab es muy sencillo, tal y como hemos podido ver, ahora os vamos a enseñar algunos comandos básicos para controlar el funcionamiento del propio Crontab en sistemas operativos Linux y que puedas ponerlo en práctica. Simplemente vas a tener que llevar a cabo estos pasos y podrás comenzar a usarlo.

Para remplazar el archivo existente por otro que defina el usuario se debe utilizar el siguiente comando:

crontab archivo

Para editar el archivo existente en la actualidad se utiliza el comando que ya hemos visto a lo largo de este artículo:

crontab -e

Listar todas las tareas existentes en el crontab del usuario:

crontab -l

Borrar el crontab que está configurado:

crontab -d

Definir el directorio en el que se almacenará el archivo de crontab. Para realizar esta operación se deben tener permisos de ejecución en dicho directorio:

crontab -c dir

Instrucción para manejar el crontab de otros usuarios existentes en el sistema:

crontab -u usuario

Herramientas para Cron

Si buscamos automatizar ciertos aspectos en las tareas y de este modo evitar errores, podemos encontrarnos con algunas herramientas donde podremos escribir en este formato cron, como las siguientes:

  • Contrab Guru: Se trata de un editor rápido y sencillo para crear expresiones de programación cron. Nos facilita alertas en tiempo real acerca de los posibles errores o inconvenientes que se puedan presentar a la hora de crear estas expresiones.
  • Cron Job Generator: Con esta herramienta podremos crear y programar diferentes secuencias de comandos para que estos se ejecuten a una hora predeterminada.
  • EasyCron: Nos permite programar tareas para llamar a URL específicas en diferentes intervalos de tiempo y momentos concretos. Nos facilitará la administración de trabajo cron con un panel de usuario a nuestra disposición y programar labores de acuerdo con fecha y hora configurada en nuestro sistema. También podremos ver registros de la ejecución de cada tarea y el envío de avisos por correo electrónico. Estas notificaciones, es posible establecer condiciones para que sean enviadas, como puede ser cada vez que se ejecuta o cuando ocurre algún fallo. Otra de sus funciones es el registro que pueden generar sus scripts durante las ejecuciones periódicas, estas las guardar para poder realizar un análisis posterior. Estos ficheros también se pueden generar con ciertos filtros, como por ejemplo, uno dedicado a los fallos que pueden ocurrir.

La última aplicación descrita, es sin duda la más completa de todas ellas a nivel de funciones, pero si hay que recalcar, que las otras dos son más sencillas de usar y de entender, pero tienen ciertas limitaciones a la hora de generar lo que necesitamos.

Logs en Cron

Con Cron tenemos la posibilidad de almacenar en un archivo las logs. Pero este puede resultar un poco lioso, ya que no solo se van a guardar las que a nosotros nos interesen. Si no que se guardarán todas ellas. En todo caso, es posible crear comandos para poder filtrar todo ese contenido. Si bien la información no va a ser todo lo detallada que nos gustaría, nos sirve para disipar alguna posible duda que podamos tener, o para buscar algún problema que se está produciendo.

El archivo, por lo general se llama: /var/log/syslog

Tipos de archivos de configuración cron

En el caso de cron, nos podemos encontrar con dos tipos de archivos de configuración, estos son:

  • Crontab de sistema UNIX / Linux: Este nos requiere privilegios de root, pues por lo general se utiliza para servicios del propio sistema o trabajos que pueden alcanzar una importancia crítica para el mismo. A mayores, también requiere un nombre de un usuario, con el cual procederá a ejecutar los comandos, de esta forma le damos a crontab a ejecutar comandos como cualquier usuarios en el sistema.
  • El usuario crontab: Es posible que un usuario pueda instalar sus propios trabajos usando el comando crontab. Pero también necesita un campo con el comando a ejecutar, y de nuevo se ejecutan como un usuario, pero en este caso, tiene la peculiaridad de que solo podrá ser lanzado por el usuario que creó el crontab. De esta forma, todos los usuarios pueden disponer de su propio archivo crontab, se almacenan en /var/spool/cron/contrabs, y no están destinados a ser editados de forma directa. Para ello tendremos que usar el comando crontab de forma que editamos o configuramos los trabajos propios, o creamos nuevos cron.

Alternativas a Cron y Crontab

Ahora que ya estamos familiarizados con Cron y Crontab, vamos a ver algunas alternativas que podemos utilizar para realizar tareas similares. Todas ellas tienen sus pequeñas peculiaridades, a pesar de realizar funciones diferentes.

La primera que nos vamos a encontrar es Anacron. Este no necesita que un equipo se encuentre siempre funcionando, y se puede ejecutar sus tareas para que se ejecuten en cualquier momento. En el caso de que el equipo esté apagado, la tarea se ejecutará cuando se encienda de nuevo. Este paquete está disponible en muchos paquetes de Linux, pero se puede instalar en caso de no disponer de él.

Fcron es otra de las alternativas. Este tampoco requiere que el equipo esté en funcionamiento, y puede trabajar con tareas asignadas a una hjora y minuto específico. Pero en este caso, será necesario realizar la instalación mediante un archivo de código fuente, y una vez compilado, podremos utilizarlo.

Algo más desconocido es hcron. El cual tiene algunas características interesantes, como por ejemplo la oportunidad de establecer etiquetas para organizar todo el trabajo correctamente, administrar una red, o directamente los archivos de usuarios. Lo cual también genera mejoras en la seguridad. Este paquete también es necesario instalarlo, pero si hay alguna distribución que lo incorpora de serie.

Pero si queremos realizar estas tareas con algún otro software externo, podemos hablar de Mcron, el cual es muy similar a los anteriores. Incluso así, tiene sus diferencias, las cuales pueden hacerlo muy útil para algunos administradores, y es que a diferencia de los anteriores, este permite redefinir la programación de tareas usando la reconstrucción de trabajos desde un punto inicial. Su instalación es muy sencilla y una vez instalado, podemos empezar a utilizarlo como nuestro programador de tareas, puesto que no es habitual que se encuentre incorporado de serie en ningúna versión.

Programar tareas en Windows

Seguramente en algún punto del post, te has preguntado si todo esto es compatible con Windows. Pero incluso con las posturas entre los dos sistemas operativos más cercanas que nunca, lo cierto es que Windows cuenta con su propio gestor de programación de tareas. Se trata de un método más sencillo, por interfaz gráfica, y tan eficaz como estos dos comandos. Realizar tareas repetitivas, establecer horarios, recordatorios, todo se puede configurar de igual forma en Windows.

El proceso es sencillo, simplemente tendremos que ir a la barra de búsqueda de Windows, y escribir «Programar tareas», y entrar. Una vez abierta veremos todas las opciones que tenemos disponibles, las cuales nos dan bastante libertad de edición. A lo cual podemos añadir scripts en archivos bat, lo cual hace de todo este proceso algo muchísimo más completo.

Según navegamos por todos los menús, vemos que Windows nos facilita mucho el proceso, indicándonos dónde poner cada cosa hasta finalizar el proceso, el cual puede ser tan creativo como queramos. Una vez finalizado, también nos dará algunas opciones para realizar la tarea programada. En este momento, la tarea estará lista para ser ejecutada cuando hayamos establecido. De lo contrario, tendremos que acudir a borrarla, y simplemente no se ejecutará nunca más.

Con respecto a los archivos .bat, en los cuales podemos programar también tareas, y estos a su vez combinarlos con otras tareas, puede resultar un poco más complicado. Esto es porque se requieren ciertas nociones de programación, las cuales pueden ser tan extensas como queramos. De nuevo la creatividad puede jugar un papel muy importante en todo esto. Lo que debemos tener en cuenta, es que tanto con archivos .bat como con el programador de tareas, podemos automatizar nuestro equipo hasta puntos muy elevados, y a la vez complejos.

Cómo has podido ver, programar la ejecución de tareas no es nada complicado y se puede realizar de forma rápida si se tiene claro todo lo mencionado en este tutorial. Hemos mostrado cómo funciona Cron y Crontab, dos opciones que vas a tener disponibles para que una tarea se ejecute en un momento determinado de tiempo. Si usas alguna distribución de Linux, vas a poder utilizarlos sin problemas. Podrás adaptar el tiempo y la automatización de procesos según necesites.

2 Comentarios