Ejecutar script automáticamente con Cron en Linux

- 👤 Andrés Cruz

🇺🇸 In english

Ejecutar script automáticamente con Cron en Linux

Los Cron son administradores de procesos que se ejecutan en segundo plano cada cierto tiempo según sean configuremos; son ampliamente utilizados para hacer backup programados.

Como usuarios podemos automatizar tareas con comandos BASH (por ejemplo para ejecutar un script como un .sh); de esta forma podemos tener una administración completa de un sistema; no sólo es posible emplear .sh para utilizar un Cron, también se puede emplear cualquier tipo de comando BASH (por ejemplo para ejecutar un archivo PHP); todo depende de lo que se desee hacer.

Una de las cosas que más me gusta de Linux es que prácticamente todo se puede automatizar. Siempre existe alguna función, configuración o herramienta que permite olvidarte de tareas repetitivas: desde montar unidades, ejecutar chequeos, generar logs o lanzar scripts sin intervención manual.
En este artículo voy a explicar cómo ejecutar un script automáticamente en Linux usando cron, pero también cuándo no conviene usarlo y qué alternativas reales existen, basándome en lo que yo mismo he usado en sistemas Linux reales.

Automatización de tareas en Linux: por qué cron sigue siendo imprescindible

Cuando hablamos de automatización en Linux, cron sigue siendo el estándar de facto. No es nuevo, no es moderno, pero funciona de forma fiable y predecible, tanto en sistemas de escritorio como en servidores.

Cron permite:

  • Ejecutar scripts en intervalos de tiempo
  • Automatizar tareas de mantenimiento
  • Lanzar procesos sin depender del usuario

En mi caso, cron ha sido clave para tareas periódicas, pero también aprendí —a veces por las malas— que no todas las automatizaciones encajan bien en cron.

¿Qué es cron y cómo funciona en Linux?

Qué es un cron job

Un cron job es una tarea programada que el sistema ejecuta automáticamente siguiendo una planificación definida (minuto, hora, día, mes, etc.). Estas tareas se definen en un archivo llamado crontab.

Diferencias entre Cron y Crontab

Aunque pareciera que estamos indicando sinónimos cuando nos referimos al uno o al otro, estos son dos elementos independientes, en donde el Cron es un proceso y el otro es un archivo de texto que nosotros personalizamos con las reglas que explicaremos más adelante.

En resumen:

  • cron es el servicio que ejecuta las tareas
  • crontab es el archivo donde se definen

Cada usuario puede tener su propio crontab, incluido root, algo importante cuando el script necesita permisos elevados.

El Cron es un demonio (servicio)

El Cron es un demonio o también conocido como servicio, y por lo tanto solo es iniciado una vez, generalmente con el mismo arranque del sistema y al iniciar y cada cierto tiempo revisa si tiene algo que hacer, una tarea conocida como job que es lo que nosotros configuramos y la compara con la fecha del sistema para ver si existen coincidencias entre la hora programada en el crontab con la hora del sistema.

Cómo ejecutar un script automáticamente con cron en Linux

Requisitos previos: permisos, shebang y rutas absolutas

Aquí es donde mucha gente falla. Yo también fallé al principio.

Antes de usar cron, tu script debe:

  • Tener permisos de ejecución:
chmod +x script.sh

Tener un shebang correcto:

#!/bin/bash

Usar rutas absolutas, nunca relativas

Cron no carga tu entorno de usuario, así que asumir rutas o variables suele provocar errores silenciosos.

Crear un cron job paso a paso: Crontab es un archivo en nuestro Linux

Cron es el administrador de procesos, Cron lee en un archivo de texto plano llamado Crontab en donde se guardan una lista de comandos creados por el usuario ha ser ejecutados; la sintaxis para crear una de estas tareas programadas en muy sencilla:

# ┌───────────── Minuto (0 - 59)
# │ ┌─────────── Hora (0 - 23)
# │ │ ┌───────── Día del mes (1 - 31)
# │ │ │ ┌─────── Mes (1 - 12)
# │ │ │ │ ┌───── Día de la semana (0 - 7, donde 0 y 7 son Domingo)
# │ │ │ │ │
# * * * * * comando_a_ejecutar

Formato básico de una tarea en el Crontab: Agregar tareas al Crontab

Antes de usar cron, tu script debe:

  • Tener permisos de ejecución:
  • chmod +x script.sh
  • Tener un shebang correcto:
  • #!/bin/bash
  • Usar rutas absolutas, nunca relativas

Cron no carga tu entorno de usuario, así que asumir rutas o variables suele provocar errores silenciosos.

Básicamente un CRON consta de dos mitades:

  • El tiempo en el cual se ejecutará la tarea del Crontab; el mismo está compuesto por operadores y resulta de lo más versátil:
    • Cada minuto: En intervalos de entre 0 a 59.
    • Cada hora: En intervalos de entre 0 a 23.
    • Cada día: En intervalos de entre 0 a 31.
    • Cada mes: En intervalos de entre 0 a 12 (0==12 y 12 == Diciembre).
    • Cada día de la semana: En intervalos de entre 0 a 7 (0==7 y 7 == domingo).
  • El comando BASH: /ruta/completa/script.sh

Como puedes ver son bloques de duración que van desde minutos a días de semana y mes; si se deja un asterisco, esto quiere decir que el Cron se ejecuta cada minuto, hora, día del mes:

* * * * * /path/para/script.sh

Ejecuta el script.sh cada minuto, de cada hora, de cada día del mes, de cada semana; en otras palabras, el Cron ejecuta el script cada minuto de los 365 días del año.

Para ejecutar un .sh cada cierto tiempo podemos hacer algo como lo siguiente:

1 2 3 4 5 /path/para/script.sh

Si el .sh recibe parámetros:

1 2 3 4 5 /path/para/script.sh p1 p2 ... pn

En donde p1, p2, ... pn son los parámetros que recibe el .sh.

Uso de los operadores en una tarea para el Crontab

Con los operadores es posible especificar varios valores en un campo; existen tres posibles valores:

  • El asterisco (*): Este operador abarca todos los valores posibles; un asterisco en un campo minutos es igual a ejecutar el script cada minuto.
  • la coma (,): Este operador permite especificar una lista de valores; por ejemplo si queremos ejecutar un comando los lunes y miércoles: "1,3" en el campo de los días.
  • El guión (-): Este operador especifica una serie de valores de manera agrupada con un cota inferior y una superior; por ejemplo si quisiéramos ejecutar un comando de lunes a viernes podríamos colocar el siguiente valor en el campo día: "1-5", que es equivalente a 1,2,3,4,5.

Agregar una tarea para su ejecución

Ya vimos como es el formato básico de un Cron, ahora lo interesante resulta en ¿Cómo agregamos un Cron o nuestra tarea para su ejecución?

Abrimos nuestro consola o terminal:

consola de linux

Ejecutamos el siguiente comando:

Crontab -e 
consola de linux editando crontab con vi

a través de un editor de consola; VI, VIM, nano o cualquier otro que se tengan instalado, agregamos la tarea al Crontab; por ejemplo:

0 22 * * 1-5 /home/fedora/sh/backup.sh

Si deseas ver la lista de tareas en el Crontab en el sistema:

Crontab -l

Ejemplos de tareas en el Crontab: Intervalos de tiempo

Si deseamos ejecutar una tarea del Crontab cada 5 minutos:

*/5 * * * * /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab cada 10 minutos:

*/10 * * * * /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab cada 20 minutos:

*/20 * * * * /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab cada 30 minutos:

*/30 * * * * /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab cada 40 minutos:

*/40 * * * * /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab cada 50 minutos:

*/50 * * * * /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab cada 60 minutos:

*/60 * * * * /home/fedora/sh/backup.sh

Creo que quedó clara la idea; simplemente debes de variar la cantidad de minutos en la primera posición para que nuestro Cron haga el resto por nosotros.

Si deseamos ejecutar una tarea del Crontab a las 10 de la mañana:

0 10 * * * /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab a las 2:15 de la tarde todos los días:

15 14 * * * /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab a las 2:15 de la tarde todos los días exceptuando los fines de semana (de lunes a viernes):

15 14 * * 1-5 /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab a las 2:15 de la tarde todos los domingos:

15 14 * * 0 /home/fedora/sh/backup.sh

o

15 14 * * 7 /home/fedora/sh/backup.sh

o

15 14 * * sun /home/fedora/sh/backup.sh

Si deseamos ejecutar el 21 de octubre a las 7:21:

21 7 21 10 * /home/fedora/sh/backup.sh

Si deseamos hacer un backup todos los días a las ocho de la noche y guardar un registro (log) con los posibles errores al ejecutar el Crontab:

0 20 * * * /home/fedora/sh/backup.sh >>  /home/fedora/sh_backup/cron_ruas.log 2>&1

¿Cómo ejecutar PHP periódicamente con Cron en un servidor Linux?

Para ejecutar un php cada cierto tiempo podemos utilizar el siguiente comando:

php /var/www/html/prueba/test.php

Resulta interesante esta posibilidad; recordando un poco un artículo pasado:

¿Cómo conectarnos a Twitter y enviar tweets con PHP? vimos como conectar una aplicación escrita en PHP con la API de Twitter y de esta forma poder realizar muchas tareas u operaciones; básicamente enviamos un tweet; ahora podríamos automatizar la ejecución de este script PHP para enviar los tweets:

*/5 * * * * php /var/www/html/twitter/sendtweets.php

Para enviar tweets cada cinco minutos.

Consideraciones

Recuerda cambiar los permisos del archivo para que pueda ser ejecutado por el administrador de Cron:

chmod a+x /home/fedora/sh/backup.sh

Puede que sea necesario reiniciar el servicio Cron luego de agregar una tarea:

service crond restart

Crear un cron job paso a paso

Edita el crontab:

crontab -e

Añade una línea como esta:

*/5 * * * * /ruta/completa/script.sh

Esto ejecutará el script cada 5 minutos.

Cuando lo probé por primera vez, el script no se ejecutaba… y el problema no era cron, sino que el script funcionaba en terminal pero no en cron por culpa del entorno.

Ejemplos prácticos de cron para scripts bash

Ejecutar un script al arrancar el día:

0 6 * * * /ruta/script.sh

Ejecutar cada hora:

0 * * * * /ruta/script.sh

Ejecutar cada domingo:

0 3 * * 0 /ruta/script.sh

Errores comunes al ejecutar scripts con cron (y cómo solucionarlos)

Cron no ejecuta el script

Este es el clásico. En mi experiencia, suele deberse a:

  • Falta de permisos
  • Rutas incorrectas
  • Variables de entorno inexistentes

Solución rápida: ejecuta el script exactamente como cron lo haría.

Problemas con variables de entorno

Cron no carga .bashrc ni .profile. Si tu script depende de variables, defínelas dentro del propio script o en la línea del cron job.

Dónde ver los logs de cron

Según la distribución:

  • /var/log/syslog
  • /var/log/cron
  • journalctl -u cron

Revisar logs me ahorró horas de frustración más de una vez.

Ejecutar scripts automáticamente al iniciar Linux

Aquí es donde cron no siempre es la mejor opción.

Muchas veces no necesitaba programar una tarea, sino que el script se ejecutara apenas arrancaba el sistema, por ejemplo para montar unidades o lanzar comprobaciones iniciales.

Cuándo cron no es la mejor opción

  • Scripts que deben ejecutarse una sola vez al arranque
  • Tareas que dependen del estado inicial del sistema
  • Procesos que no tienen sentido en intervalos

Ejecutar scripts al arranque usando rc.local

Una solución sencilla y efectiva es rc.local.

Archivo:

/etc/rc.local

Contenido típico:

#!/bin/sh -e
sh /ruta/script.sh
exit 0

En Fedora, por ejemplo, este archivo no existe por defecto, pero puede crearse y funciona sin problemas. Cuando lo usé por primera vez, me sorprendió lo simple y efectivo que era para ciertos casos.

Alternativa moderna: systemd

Hoy en día, systemd es la opción más correcta para servicios persistentes. Es más verboso, pero también más robusto.

Ideal si:

  • El script debe ejecutarse como servicio
  • Necesitas control de estado
  • Trabajas en servidores modernos

Cron vs rc.local vs systemd: qué opción elegir en cada caso

  • Caso    Mejor opción
  • Tareas periódicas    cron
  • Script al iniciar    rc.local
  • Servicios complejos    systemd

No todo debe resolverse con cron. Entender esto marca la diferencia entre un sistema funcional y uno frágil.

Buenas prácticas para automatizar scripts en Linux

Usa rutas absolutas

  • Loggea siempre la salida del script
  • Prueba el script fuera de cron
  • No asumas entorno de usuario
  • Documenta qué hace cada tarea

Estas prácticas nacen de errores reales, no de teoría.

Preguntas frecuentes sobre cron y automatización en Linux

  • ¿Cómo ejecutar un script automáticamente en Linux?
    • Usando cron para tareas periódicas o rc.local/systemd para scripts al inicio.
  • ¿Qué permisos necesita un script para cron?
    • Permiso de ejecución y acceso a los recursos que utiliza.
  • ¿Por qué cron no ejecuta mi script?
    • Normalmente por rutas incorrectas o variables de entorno.
  • ¿Dónde ver los logs de cron?
    • En syslog, cron.log o mediante journalctl.

Conclusión

Cron sigue siendo una herramienta imprescindible para ejecutar scripts automáticamente en Linux, pero no es la única ni siempre la mejor. En mi experiencia, combinar cron con rc.local o systemd según el caso es la forma más limpia y eficiente de automatizar un sistema Linux sin complicaciones innecesarias.

Acepto recibir anuncios de interes sobre este Blog.

Los Cron son administradores de procesos que se ejecutan en segundo plano cada cierto tiempo según sean configuremos, vamos a ver como usarlos, definiciones, ejemplos comunes y errores al usarlos.

| 👤 Andrés Cruz

🇺🇸 In english