Automatización de tareas. Cron
1. Introducción
En cualquier sistema informático existe la necesidad de automatizar ciertas tareas con una periodicidad concreta. Algunas tareas son propias del administrador, aunque algunas otras son necesidades a nivel de usuario.
La tarea programada más común puede ser el antivirus (es aconsejable como mínimo semanalmente en sistemas Windows hacer un escaneo del sistema) pero hay muchas otras tareas que requieren automatización como puede ser:
– Revisar ocupación de discos y procesador para comprobar que el sistema está actuando a óptimo rendimiento.
– Borrado de ficheros e información temporal.
– Realización de informes mensuales, semanales (etc).
– Apagado del sistema de forma ordenada y automática.
– Descarga de información periódica.
– Sistema de notificaciones periódicas.
– etc.
En muchos sistemas Linux, la automatización de tareas ya viene preconfigurada en la instalación. Otras veces hay que instalarla con la herramienta correspondiente.
Generalmente para sistemas GNU/Linux los procesos de automatización de tareas más utilizados son cron y at aunque en este post también se verá anacron y GNOME-schedule.
2. Cron
Generalmente este demonio siempre está instalado en los sistemas (instalado y arrancado). El problema de cron es que asume que el equipo siempre va a estar en funcionamiento (típico en los servidores pero no en los equipos personales), lo cual hace que no sea la herramienta ideal para instalarla en un equipo personal.
Instalación de cron en el sistema
El nombre del paquete es cron y si queremos ver la información del paquete en pantalla podemos ejecutar el siguiente comando:
y aparecerá la información que se muestra en la imagen anterior.
También si tenemos Ubuntu, desde Synaptic saldrá mucha información buscando previamente por el nombre de paquete.
Si no se tiene instalado en el sistema y se desea instalar (hay que hacerlo con permisos de root), basta con ejecutar el siguiente comando:
Información básica de cron
Las características más importantes del servicio cron son las siguientes:
Imporante: la configuración del funcionamiento de cron se encuentra dentro del directorio /etc.
Arranque y parada del demonio
Para poder arrancar o parar el demonio cron hay que ejecutar las órdenes siguientes:
¿Cómo se sabe si está ejecutándose cron? Mediante el siguiente comando:
Como se puede ver en la imagen anterior se observa si el demonio está en ejecución y su PID (identificador de proceso). En Ubuntu por defecto se instala por defecto y se está ejecutando siempre.
Formato del fichero de configuración (/etc/crontab)
El fichero crontab esta dividido en líneas y cada línea representa una tarea programada. Estas líneas tienen el siguiente formato:
# minuto hora día mes día_semana usuario orden_a_ejecutar
Estos campos pueden tener los siguientes valores:
Símbolos especiales para los cinco primeros campos.
* : indica cualquier valor
, : actúa como separador de una lista de valores
# : indica que lo que acompaña es un comentario (no se ejecutará)
– : sirve para indicar un rango de valores
/ : sirve para indicar un paso de valor (por ejemplo, en el campo hora si se indica */4 se está detallando que la tarea se realizará cada cuatro horas).
Por ejemplo, imaginemos que se quiere ejecutar un script scr.sh a las 9 y las 18 horas todos los días laborables, la línea de configuración sería la siguiente:
0 9,18 * * 1-5 scr.sh
Imaginemos que queremos ejecutar el script el día 18 del mes y todos los martes:
* * 18 * 2 echo scr.sh
La línea anterior se ejecutará todos los martes y los días 18 de cada mes. Y el martes 18 se ejecutará dos veces.
Cadenas comodín
En vez de la configuración anterior se pueden utilizar las siguientes cadenas comodín:
@reboot: Se ejecuta al iniciarse la máquina.
@yearly: Se ejecuta una vez al año.
@monthly: Se ejecuta una vez al mes.
@weekly: Se ejecuta una vez por semana.
@daily: Se ejecuta una vez al día.
@hourly: Se ejecuta una vez por hora.
Por ejemplo la línea «@reboot /home/usuario/al_arrancar.sh» ejecutará /home/usuario/al_arrancar.sh cuando arranque el sistema.
Importante: Todas las tareas programadas se ejecutan mediante una shell.
¿Qué hace el siguiente comando?
01 04 1 1 1 /home/usuario/al_arrancar.sh
El comando anterior ejecutará /home/usuario/al_arrancar.sh a las 4:01am de Enero y cada Lunes en Enero
¿Qué hace el siguiente comando?
01 04 * * * /home/usuario/al_arrancar.sh
El ejemplo anterior ejecutará /home/usuario/al_arrancar.sh a las 4:01am cada día de cada mes.
¿Qué hace el siguiente comando?
01,31 04,05 1-15 1,6 * /home/usuario/al_arrancar.sh
El ejemplo anterior ejecutará /home/usuario/al_arrancar.sh a las 4 o 5 y un minuto o 31 minutos desde el 1 hasta el 15 de cada Enero hasta Junio.
¿Y si quiero ejecutar un comando cada 10 minutos?
*/10 * * * * /home/usuario/al_arrancar.sh
¿Sería esta línea equivalente?
0,10,20,30,40,50 * * * * /usr/bin/somedirectory/somecommand
SI
¿Qué hace el siguiente comando?
45 04 * * * /home/usuario/al_arrancar.sh
Ejecuta el comando /home/usuario/al_arrancar.sh a las 4 y 45 de la mañana
¿Qué hace el siguiente comando?
45 04 * * * /home/usuario/uno.sh && /home/usuario/dos.sh
Ejecuta el comando dos.sh a las 4 y 45 de la mañana solo si uno.sh se ejecuta con éxito.
Orden Crontab
Cron también se puede configurar mediante la orden crontab. Crontab lo que hace es gestionar los ficheros crontabs asignados a cada usuario (en /var/spool/cron/crontabs/).
Crontab permite a cada usuario poder gestionar sus propias planificaciones de tareas.
Su sintaxis consiste en la orden crontab seguida del fichero, y de forma opcional, algunos parámetros:
crontab [-l e r u] fichero
Respecto a los parámetros, su significado es el siguiente:
-l : muestra el fichero de configuración del usuario
-e: edita el fichero de configuración del usuario
-r: borra el fichero de configuración del usuario
-u usuario: especifica el usuario propietario de la tarea (normalmente, esta opción la usa el usuario root para cambiar propietarios de tareas).
La imagen anterior muestra el resultado de ejecutar varios comandos crontab.
Si el usuario morenoperezjc ejecuta un fichero tipo cron se guardará un archivo morenoperezjc en el directorio /var/spool/cron/crontabs/. Para ejecutar un crontab puede ser administrador o pertenecer al grupo de usuarios crontab.
Un ejemplo sencillo de cómo programar las tareas sería:
1.- Generar un fichero de nombre ejemplo.cron de una línea (recordar que se ejecutan las tareas por líneas mediante un shell) con el contenido:
@reboot rm /home/morenoperezjc/Descargas/*
2.- Ejecutar la carga del fichero de planificación:
esto creará un fichero morenoperezjc en el directorio /var/spool/cron/crontabs/
3.- Para estar seguro que se ha añadido a la lista de tareas, mirar la lista de las mismas:
El ejemplo anterior borrará todos los archivos descargados en la máquina cada vez que se reinicie la misma.
Si queremos desprogramar la tarea, osea eliminar las tareas programadas con crontab habrá que ejecutar el siguiente comando:
Existen dos ficheros para poder permitir o denegar el servicio a determinados usuarios del sistema. Estos ficheros son los siguientes:
/etc/cron.allow: si existe este fichero, sólo los usuarios contenidos en él tendrán permiso para ejecutar tareas programadas. Cada usuario tiene que estar en una linea diferente.
/etc/cron.deny: en el caso que queramos denegar el acceso a las tareas programadas, se deberá crear este archivo y registrar los usuarios que no podrán programar tareas (uno por línea).
En Ubuntu por defecto no existen estos ficheros (ni en Debian pero no en otros sistemas Linux o Unix) y el comportamiento por defectos es permitir a todos los usuarios que ejecuten trabajos vía crontab.
Si por el contrario creas un fichero cron.allow o cron.deny en blanco el comportamiento del demonio cambia. En ese momento solamente podrán utilizar el cron los usuarios root y aquellos que estén inscritos en el fichero cron.allow.
Otra cosa: los usuarios que no aparecen en el /etc/shadow no tendrán el crontab operativo. Si creas un usuario en /etc/passwd pero no en el /etc/shadow el crontab del usuario nunca podrá ejecutarse. La solución es insertar un usuario en el /etc/shadow pero con un * en el campo password crypt. Por ejemplo:
andrino:*:15169::::::
Ejercicios propuestos
1 Programa una tarea que cada 10 minutos escriba la fecha y hora del sistema
en un fichero mi-cron.log situado en el escritorio del usuario.
2 Crea un script que haga un tar de tu directorio home y que lo guarde en /backup, el nombre de dicho tar estara formado por la fecha y la hora en formato «ddmmaaaahhmmss», un guión y la palabra home-bk, por ejemplo:
23032009194520-root-bk.tar.gz
Deben guardarse en el directorio /backup. Programe cron para que ejecute este script cada 15 minutos.
3 Deja una tarea programada para que apague el equipo todos los das a las 16:00h.
4 Realiza un script que compruebe que los ficheros de un directorio concreto no cambian de tamaño ni se añaden o eliminan. El script avisará de los posibles cambios en un fichero de log. El script se debe ejecutar cada 5 minutos.
5 Programa una copia de seguridad todos los lunes con crontab. La copia de seguridad deberá de ser de los ficheros o directorios especificados en el fichero acopiar.txt. Comprueba que este script lo podrá ejecutar los usuarios Perico, Juanico pero no Andrés.
6 Realiza un script que mire la ocupación de disco de cada partición montada en el sistema, cada 5 minutos, y que le enve un email al administrador en caso de que alguna de ellas esté a más del 90% de ocupación. El email debe incluir la fecha y la hora, el nombre de la máquina, el punto de montaje de cada partición y el porcentaje de ocupación.
Hola me ha encantado su web, pero me preguntaba si podría facilitarme la solución a los Ejercicios propuestos. Muchas gracias, Un saludo.