Crontab en Linux: Tutorial de configuración paso a paso

El crontab en Linux es una herramienta que nos permite programar tareas para que se ejecuten de manera automática en un momento en el tiempo que especifiquemos. En este pequeño tutorial veremos el proceso de configuración del crontab, incluyendo ejemplos prácticos para activar varias configuraciones.

¿Qué es Crontab?

Crontab (acrónimo de cron table) es un archivo de texto que contiene una lista de comandos que serán ejecutados de forma repetitiva en aquel momento en el tiempo que definamos. Cron es un daemon que lee este archivo y ejecuta los comandos cuando el tiempo definido coincida con el momento actual.

El crontab es una herramienta estándar que se encuentra en la mayoría de las distribuciones de Linux, ya que es una parte integral del sistema para la automatización de tareas. A continuación, se enumeran algunas de las distribuciones de Linux más comunes en las que se puede encontrar crontab:

  1. Ubuntu: Una de las distribuciones más populares y amigables para el usuario, basada en Debian.
  2. Debian: Conocida por su estabilidad y su filosofía de software libre, es la base para muchas otras distribuciones, incluida Ubuntu.
  3. CentOS: Una distribución derivada de Red Hat Enterprise Linux (RHEL), enfocada en la estabilidad y la seguridad.
  4. Red Hat Enterprise Linux (RHEL): Orientada al mercado empresarial, ofrece soporte a largo plazo y es conocida por su robustez.
  5. Fedora: Patrocinada por Red Hat, es conocida por ser una plataforma para la innovación y la tecnología de vanguardia.
  6. Arch Linux: Conocida por su simplicidad y control total por parte del usuario, sigue la filosofía KISS (Keep It Simple, Stupid).
  7. openSUSE: Ofrece tanto una versión de lanzamiento continuo (Tumbleweed) como una de lanzamiento fijo (Leap), y es conocida por su herramienta de administración Yast.
  8. Linux Mint: Basada en Ubuntu y Debian, es popular por su facilidad de uso y su enfoque en la experiencia de escritorio.
  9. Manjaro: Basada en Arch Linux, busca ofrecer la potencia de Arch con una experiencia más amigable para el usuario.
  10. Alpine Linux: Una distribución ligera y segura, diseñada para mayor eficiencia y enfocada en la seguridad.

Instalación de Cron

En la mayoría de estas distribuciones, cron y crontab están preinstalados. Sin embargo, en algunas distribuciones minimalistas o específicas, es posible que necesites instalarlos manualmente. Aquí hay cómo hacerlo en algunas distribuciones populares:

En Debian, Ubuntu y derivadas:

sudo apt-get update
sudo apt-get install cron

En CentOS, RHEL y derivadas:

sudo yum update
sudo yum install cronie

En Fedora:

sudo dnf install cronie

En Arch Linux y derivadas:

sudo pacman -S cronie

Habilitar y Comprobar el Servicio de Cron

Después de instalar cron, asegúrate de que el servicio esté habilitado y funcionando:

sudo systemctl enable crond
sudo systemctl start crond
sudo systemctl status crond

Estos comandos aseguran que el servicio cron se inicie automáticamente en el arranque y verifican su estado actual.

Paso 1: Acceder al Crontab

Para empezar a editar tu crontab, abre un terminal y ejecuta el siguiente comando:

crontab -e

Si es la primera vez que lo usas, se te pedirá que elijas un editor de texto. Selecciona tu preferido (nano, vim, etc.).

Paso 2: Entender la Sintaxis del Crontab

Cada línea en un crontab sigue esta estructura:

* * * * * comando

Donde cada asterisco representa una unidad de tiempo:

  • Minutos (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 representan el domingo)

Paso 3: Ejemplos de Configuraciones

Ejemplo 1: Ejecutar un script cada día a las 4:30 de la madrugada

Supongamos que tienes un script ubicado en /home/usuario/scripts/backup.sh que realiza una tarea de backup y quieres ejecutarlo todos los días a las 4:30 AM. Añade la siguiente línea a tu crontab:

30 2 * * * /home/usuario/scripts/backup.sh

Ejemplo 2: Borrar archivos temporales cada semana

Para limpiar los archivos temporales cada domingo a la medianoche:

0 0 * * 0 /usr/bin/find /tmp -type f -atime +7 -delete

Ejemplo 3: Sincronizar el reloj del sistema cada hora

Si deseas sincronizar el reloj del sistema cada hora:

0 * * * * /usr/sbin/ntpdate -s time.nist.gov

Ejemplo 4: Ejecutar múltiples tareas

Puedes tener múltiples tareas en tu fichero de crontab. Por ejemplo:

0 8 * * 1-5 /home/usuario/scripts/stats.sh  # Informe enviado a las 8:00 de la mañana entre semana
30 1 * * * /home/usuario/scripts/backup.sh  # Backup todos los días a la 1:30 de la madrugada

#TAREAS DE SERVIDOR
0 4 1 * * /home/usuario/scripts/maintenance.sh  # Mantenimiento mensual el primer día de cada mes a las 04:00

La almohadilla (#) se utiliza para realizar comentarios en el fichero que serán ignorados por el cron, así tanto una línea que comienza por almohadilla como a partir de donde se coloque, será ignorado.

Paso 4: Guardar y Salir

Una vez que hayas añadido tus tareas, guarda el archivo y cierra el editor. El daemon cron automáticamente recargará el crontab y ejecutará las tareas según lo programado.

Paso 5: Verificar el Crontab

Para verificar que tu crontab se ha guardado correctamente, puedes listar las tareas programadas con, se mostrará la configuración completa:

crontab -l

Consideraciones Adicionales

  • Logs de Cron: Los registros de las tareas cron generalmente se encuentran en /var/log/syslog o /var/log/cron. Revisa estos archivos de log para solucionar problemas si tus tareas no se ejecutan como esperas.
  • Permisos: Asegúrate de que los scripts que llamas desde el crontab tienen los permisos de ejecución correctos y están en la ruta que has definido.

Configurar el crontab en Linux es una tarea esencial para automatizar procesos y mantener la eficiencia del sistema. Siguiendo estos pasos, puedes programar tus tareas de manera efectiva y asegurarte de que se ejecuten puntualmente.


Espero que este pequeño tutorial te haya sido de utilidad. Si tienes alguna pregunta o comentario, no dudes en dejarlo abajo en los comentarios.

Bola extra: Listar los crontab de todos los usuarios

A veces necesitamos saber que usuario ha programado una tarea en el crontab, pero no sabemos que usuario puede ser. Existen varias maneras de listar todos los crontab de todos los usuarios de nuestro servidor, una sería:

#En sistemas RHEL, Centos y derivados
cat /var/spool/cron/*
#En sistemas Debian y derivados
cat /var/spool/cron/crontabs/*

Otro modo, que resulta más sencillo es lanzar en línea de comandos una petición para que liste el crontab de cada usuario en el fichero passwd:

for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l; done

GTC 2024: Nvidia presenta un procesador para la era de la IA generativa

Nvidia ha arrancado la conferencia de desarrolladores, GTC 2024, por la puerta grande. Su CEO y fundador, Jensen Huang, ha sido el encargado de presentar las novedades de la compañía: Nvidia Blackwell, los microservicios NIM, las API de Omniverse Cloud y mucho más.

La IA generativa promete revolucionar todas las industrias que toca, todo lo que se necesita es la tecnología para enfrentarse a ese desafío. Y la empresa de microprocesadores parece haber tomado la delantera en lo que a IA se refiere, lo que le ha llevado a aumentar su cotización en bolsa más de un 240% en el último año.

Nvidia GTP 2024
Nvidia GTP 2024

«Creamos un procesador para la era de la IA generativa», afirmó Huang cuando presentó este lunes la plataforma Blackwell y describió los principales avances que una mayor capacidad informática puede ofrecer en todos los campos, desde el software hasta los servicios, pasando por la robótica o la tecnología médica.

«La computación acelerada ha llegado a un punto de inflexión: la computación de propósito general se ha quedado sin fuerza», dijo Huang ante más de 11.000 asistentes al GTC 2024 que se dieron cita en el estadio SAP Center de Silicon Valley (con cientos de miles siguiendo en evento en streaming).

“Necesitamos otra forma de hacer informática, para que podamos seguir escalando, para que podamos seguir reduciendo el coste de la informática, para que podamos seguir consumiendo más y más informática y al mismo tiempo ser sostenibles. La computación acelerada es una aceleración espectacular respecto de la computación de propósito general, en todas las industrias”.

Su presentación de 20 minutos, con una pantalla de más de 12 metros de alto, entusiasmó a los asistentes al Centro de Convenciones de San José, entre los que se encontraban desde directores ejecutivos de las principales empresas tecnológicas a desarrolladores, empresarios y entusiastas de la inteligencia artificial.

Nvidia GTP 2024 GB200
Nvidia GTP 2024 GB200

Entre lo más destacado de su presentación, la nueva plataforma Nvidia Blackwell que liberará. la IA generativa en tiempo real en modelos de lenguaje de gran tamaño con billones de parámetros.

También Nvidia NIM, los microservicios que ofrecen una nueva forma de empaquetar y entregar software que conecta a los desarrolladores con cientos de millones de GPU para implementar IA personalizada de todo tipo. Y para llevar la IA al mundo físico, Huang presentó las API de Omniverse Cloud para ofrecer capacidades de simulación avanzadas.

GTC se ha convertido ya en una referencia en el mundo de la tecnología, la conferencia de Nvidia ha pasado de un pequeño salón de un hotel hace 15 años, a lo que hemos visto hoy, la mayor conferencia sobre inteligencia artificial del mundo, regresando a un evento presencial tras 5 años.

Al inicio de su charla, Huang explicó que el auge de la IA multimodal (capaz de procesar diversos tipos de datos manejados por diferentes modelos) le da a la IA una mayor adaptabilidad y poder, aumentando sus parámetros, estos modelos pueden manejar análisis más complejos.

Pero esto conlleva un significativo aumento de la necesidad de potencia de cómputo. Y a medida que estos sistemas colaborativos y multimodales se vuelven más complejos, con millones de parámetros, la demanda de infraestructura avanzada se intensifica.

«Necesitamos modelos aún más grandes», dijo Huang. «Vamos a entrenarlo con datos multimodales, no solo texto en Internet, lo vamos a entrenar con textos e imágenes, gráficos y tablas”.

Keynote de Jensen Huang en Nvidia GTC 2024

La próxima generación de computación acelerada

Si hubiese que resumir la presentación en pocas palabras: «necesitamos GPU más grandes», afirmó Huang mientras sacada un chip Blackwell de su bolsillo. La plataforma Blackwell parece estar diseñada para afrontar ese desafío.

Esta nueva arquitectura de microprocesadores lleva el nombre de David Harold Blackwell, matemático de la Universidad de California en Berkeley, especializado en teoría de juegos y estadística, y el primer académico negro incorporado a la Academia Nacional de Ciencias, que sucede a la arquitectura NVIDIA Hopper, lanzada hace dos años.

Nvidia GTP 2024
Nvidia GTP 2024

Blackwell ofrece un rendimiento 2,5 veces mayor que su predecesor en FP8 para entrenamiento, por chip, y 5x con FP4 para inferencia. Cuenta con una interconexión NVLink de quinta generación que es dos veces más rápida que Hopper y escala hasta 576 GPU.

Y el superchip NVIDIA GB200 Grace Blackwell conecta dos GPU Blackwell NVIDIA B200 Tensor Core a la CPU NVIDIA Grace a través de una interconexión de chip a chip NVLink de consumo ultrabajo de 900 GB/s.

«Esta es la primera de su tipo en la que cabe tanta computación en un espacio tan pequeño», dijo Huang. «Dado que esto es coherente con la memoria, se siente como si fuera una gran familia feliz trabajando juntos en una aplicación».

Para obtener el mayor rendimiento de IA, los sistemas con tecnología GB200 se pueden conectar con las plataformas NVIDIA Quantum-X800 InfiniBand y Spectrum-X800 Ethernet, también anunciadas hoy, que ofrecen redes avanzadas a velocidades de hasta 800 Gb/s.

Error al desplegar Symfony en el servidor: PHP version «>= 8.0.0»

Tras desplegar un proyecto nuevo de Symfony en el servidor de producción me he encontrado con este problema:

Composer detected issues in your platform:

Your Composer dependencies require a PHP version ">= 8.0.0". You are running 7.3.29.

Tras verificar que la versión de PHP era la correcta, y tras dar algunas vueltas por el fichero composer.json para comprobar que todo estaba en orden, probamos a forzar al actualización de composer sobre el servidor. Mano de santo!

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '906a84df04cea2aa72f40b5f787e49f22d4c2f19492ac310e8cba5b96ac8b64115ac402c8cd292b8a03482574915d1a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

Descargamos un composer.phar de la página oficial de Composer y ejecutamos una actualización sobre el proyecto:

php composer.phar update

Mostrar colores en command line (Console – Symfony2)

Desde hace algún tiempo que utilizo el component Console de Symfony2 para crear mis propios comandos en las aplicaciones Symfony2 o en solitario para otros proyectos. Una de las ventajas, es su formato colorado en pantalla, que permite distinguir de un vistazo cuando ha fallado algo o si todo ha sido correcto.

Este coloreado resulta de aplicar unos estilos predeterminados (podemos generar los nuestros propios si lo necesitamos), pero para que esto funciones es necesario tener instalados algunos paquetes. En Linux haremos uso de php-process, mientras que en Mac debemos utilizar php-posfix.

Paquetes para probar PHP 7 en Fedora y RHEL

Para los que queráis ir probando las novedades que trae PHP 7 sin necesidad de compilar desde los fuentes, el repositorio de Remi ya tiene disponible el paquete php70 en remi-test, para sistemas RHEL y Fedora.

Si no tienes los repos de Remi, puedes descargarlos desde su página, seleccionando el sistema operativo que corresponda. Puedes hacer la instalación del repo manualmente o bajarte el paquete rpm de auto-configuración del repositorio.

El paquete está disponible para Fedora 20, 21, 22 y para Enterprise Linux 6 y 7 (RHEL, CentOs, …) como una instalación separada, por lo que puedes hacerla vivir fácilmente con otros paquetes de PHP que tengas ya instalados. Para realizar la instalación:

yum --enablerepo=remi,remi-test install php70 
[salva@localhost ~]# php70 -v
PHP 7.0.0-dev (cli) (built: Apr  3 2015 08:04:28) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0-dev, Copyright (c) 
1998-2015 Zend Technologies

La instalación se realiza bajo /opt/remi, sólo está disponible bajo arquitectura x86_64 y, por el momento, sólo instala la versión 7.0.0-dev. En el blog de Remi podéis encontrar más información.

Novedades PHP 7

PHP logoLa siguiente versión de PHP, la 5.7, planificada hacia finales de este año, ha sido reemplazada por PHP 7, que, de acuerdo a su timeline, tiene previsto lanzamiento más allá de octubre de 2015. Aunque a partir de junio ya podrían estar disponibles las primeras Release Candidate (RC).

Así que quedan por delante unos meses de trabajo duro, sobre todo para los proyectos de software libre, que con toda probabilidad serán los primeros en adoptar las nuevas características y funcionalidades.

En el debate sobre el nombre de esta nueva versión, y en su posterior votación, se tomo la decisión de nombrarlo con PHP 7, en lugar de PHP 6, lo que supone saltar directamente de PHP 5.6 a PHP 7. Si el lector no ha seguido el debate puede resultar curioso, incluso desconcertante, que se haya saltado una versión, pero había mucho en juego en esta decisión.

La constante evolución de PHP trae consigo nuevas características, sobre todo cuando se trata de lanzamientos importantes, aunque la mayoría de versiones se corresponden con correcciones de errores. Muchos usuarios están deseando ver nuevas versiones y beneficiarse de las nuevas características que traen consigo.

Pero otros ven en esa evolución su cara menos favorable, toca lidiar con cambios incompatibles con versiones anteriores, donde su código funciona perfectamente. Lo que significa invertir más horas de trabajo en dejar todo a punto, por no hablar de los dolores de cabeza al tratar de arreglar el código roto por esos cambios.

Con este telón de fondo, el nombre de la nueva versión de PHP sirve para que todos sepamos que ese número define una serie de cambios y va a implicar una revisión del código de nuestros programas para asegurarnos que todo funciona como debería.

Aquellos que defendían PHP 6 afirmaban que es el siguiente número lógico, pues la versión actual es PHP 5. Pero esto entra en un pequeño conflicto con el nombre de una rama de desarrollo bautizada como PHP 6, que pretendía dar soporte Unicode a la manipulación de texto en PHP, y que quedó definitivamente muerta en 2010. Con esto PHP 6 podría confundirse con esa rama y la mayoría de desarrolladores prefirieron evitar esa confusión, por lo que la nueva gran versión de PHP será PHP 7.

Estas son algunas de las novedades ya implementadas para PHP 7:

  • Tipado en el retorno de funciones: Una característica ampliamente discutida y que permitirá tipar el retorno de una función con los valores que debe retornar, se interpondrá el valor de retorno tras los argumentos y antes de la apertura de llaves, precedido por dos puntos [RFC]
  • Declaraciones de tipos escalares: Tipado de escalares permitiendo int, float, string y bool, se utilizará combinado con declare(strict_types=1), que debe incluirse en la primera línea [RFC]
  • Quitar los warnings de date.timezone: Ya no será necesario definir esta configuración en un archivo INI o a través de la los ajustes en línea de comandos [RFC]
  • Arreglar el comportamiento de «foreach»: En algunos casos extremos, «foreach» tiene un comportamiento extraño. Estos casos están relacionados con la manipulación con puntero interno, por lo que el resultado depende de si es una referencia o no (en el RFC hay ejemplos de esas inconsistencias) [RFC]
  • Mayor rapidez al parsear parámetros en la API: Las funciones internas de PHP utilizan zend_parse_parameters para recibir los valores en variables C, que a su vez usa scanf() como método para definir los parámetros y analizar esa cadena en cada llamada, lo que provoca un consumo de recursos significativo [RFC]
  • Sintaxis de escape de punto de código Unicode: Permite agregar una sintaxis de escape de punto de código Unicode en literales de cadena, con el formato \u{202E} con comillas dobles o formato heredoc [RFC]
  • Operador ternario con isset: Con el operador ?? (doble fin interrogación) se simplifica la comprobación con operador ternario «$username = isset($_GET[‘user’]) ? $_GET[‘user’] : ‘nobody’;» por «$username = $_GET[‘user’] ?? ‘nobody’;» [RFC]
  • Comportamiento de enteros: Mejoras en la consistencia entre plataformas para el retorno en las operaciones con enteros, haciéndolo más intuitivo [RFC]
  • Fallo desbordamento ZPP: Corrige el error de magnitud que provocado por pasar un número con decimales cuando debería ser un entero, modificando la magnitud del entero al ser truncado en algunas plataformas [RFC]
  • Árbol de sintaxis abstracta: Añadido un árbol de sintaxis abstracta como un intermediario en el proceso de compilación, lo que mejora el mantemiento del parser y el compilador, y desacopla las decisiones de sintaxis de las cuestiones técnicas. Provoca cambios en list(), yield, etc [RFC]
  • Sintaxis uniforme de variables: Soporte completo a construcciones de variables, que aunque poco utilizadas, no tienen consistencia internamente [RFC]
  • Inconsistencia de list(): list() no puede ser utilizado con cadenas, pero en algunos casos si que lo hacía, esta mejora arregla esa inconsistencia [RFC]
  • Eliminar soporte hexadecimal en conversión de cadenas numéricas: Solucionar la inconsistencia entre is_numeric_string y cast cuando se convierte un hexadecimal [RFC]
  • Declaraciones de «use» en grupo: Agrupar varias definiciones de «use» a través de llaves, para especificar varios estamentos con llaves ({ }) [RFC]
  • EngineException: Usar EngineException para permitir capturar errores con excepciones [RFC]
  • Permitir «return» en iterators: Permitir el uso de «return» una vez finalizado el uso del iterator y retornados sus valores con yield [RFC]

Estas novedades están aceptadas:

  • Operador combinado de comparación (<=>, spaceship): En $a <=> $b, retorna -1 cuando $a es menor que $b, 0 en el caso de ser iguales y 1 cuando $a sea mayor que $b (del mismo modo que strcmp()) [RFC]
  • Reemplazar la extensión json por jsond: El actual Json Parser en la extensión json no tiene una licencia libre, por lo que algunas distribuciones de Linux no tienen soporte para Json, reportado en Bug #63520. Además el código de la extensión es muy viejo y sin alguien que lo mantenga hace dificil añadir nuevas mejoras [RFC]
  • Mejoras en la longitud de cadenas y enteros en plataformas de 64 bit: Permitirá trabajar a PHP de forma consistente con cadenas y enteros en cualquier plataforma de 64 bits [RFC]
  • Closure::call: Permite hacer llamadas a Closures a través del método call [RFC]
  • Eliminada tags de sintaxis alternativa: Eliminación de los script tags (script language=php) y tags ASP (<% %>), junto con sus variantes [RFC]
  • Multiples default en switch: Solución al bug que no emite un sintaxis error cuando se definen múltiples default case para un switch y ejecuta el último definido [RFC]
  • Capturar «call to a member function of a non-object»: Convertir las llamadas a métodos sin objetos a E_RECOVERABLE_ERROR, para permitir capturarlos y no detener la ejecución [RFC]

En estas todavía en fase de votación:

  • Quitar SAPIs y extensiones no disponibles o no soportadas: Algunas extensiones y módulos no tienen soporte o no están disponibles, como es el caso de apache, thttpd, mssql, ereg, etc [RFC]
  • Filtrar unserialize(): En PHP la función unserialize() tiene ciertos problemas de seguridad relacionados con la falta de control de los datos que se obtienen, la propuesta es poder filtrar la carga a una lista blanca de objetos [RFC]

Utilidades para trabajar con expresiones regulares

El otro día un compañero (gracias, Óscar) me envío un listado de URL’s con utilidades e información relacionada con expresiones regulares que siempre es útil tener a mano: