Está en la página 1de 10

Planificación de tareas en GNU/Linux

¿Qué es cron?
El nombre cron viene del griego chronos que significa “tiempo”. En el sistema
operativo Unix, cron es un administrador regular de procesos en segundo plano
(demonio) que ejecuta procesos o guiones a intervalos regulares (por ejemplo, cada
minuto, día, semana o mes). Los procesos que deben ejecutarse y la hora en la que
deben hacerlo se especifican en el fichero crontab.

Cómo funciona
El demonio cron inicia de /etc/rc.d/ o/etc/init.d dependiendo de la distribucion. Cron
se ejecuta en el background, revisa cada minuto la tabla de tareas
crontab/etc/crontab o en /var/spool/cron en búsqueda de tareas que se deban
cumplir. Como usuario podemos agregar comandos o scripts con tareas a cron para
automatizar algunos procesos. Esto es util por ejemplo para automatizar la
actualizacion de un sistema o un buen sistema de respaldos.

¿Qué es Crontab?

Crontab es un simple archivo de texto que guarda una lista de comandos a ejecutar
en un tiempo especificado por el usuario. Crontab verificará la fecha y hora en que
se debe ejecutar el script o el comando, los permisos de ejecución y lo realizará en
el background. Cada usuario puede tener su propio archivo crontab, de hecho
el /etc/crontab se asume que es el archivo crontab del usuario root, cuando los
usuarios normales (e incluso root) desean generar su propio archivo de crontab,
entonces utilizaremos el comando crontab.

Crontab es la manera mas sencilla de administrar tareas de cron en sistemas


multiusuario, ya sea como simple usuario de sistema o usuario root.
Iniciar cron

Cron es un demonio (servicio), lo que significa que solo requiere ser iniciado
una vez, generalmente con el mismo arranque del sistema. El servicio de cron
se llama crond. En la mayoría de las distribuciones el servicio se instala
automáticamente y queda iniciado desde el arranque del sistema, se puede
comprobar de varias maneras:
#> /etc/rc.d/init.d/crond status
#> /etc/init.d/crond status Usa cualquiera de los dos dependiendo de tu distro
crond (pid 507) is running...

o si tienes el comando service instalado:


#> service crond status
crond (pid 507) is running...

se puede también revisar a través del comando ps:


# ps -ef | grep crond

si por alguna razón, cron no esta funcionando:


#> /etc/rc.d/init.d/crond start
Starting crond: [ OK ]

Si el servicio no estuviera configurado para arrancar desde un principio,


bastaría con agregarlo con el comando chkconfig:
#> chkconfig --level 35 crond on

Con esto lo estarías agregando al nivel de ejecución 3 y 5, para que inicie al


momento del arranque del sistema.
Utilizando crontab

Hay al menos dos maneras distintas de usar cron:

La primera es en el directorio etc, donde muy seguramente encontrarás los


siguientes directorios:
•cron.hourly
•cron.daily
•cron.weekly
•cron.monthly

Si se coloca un archivo tipo script en cualquiera de estos directorios, entonces el


script se ejecutará cada hora, cada día, cada semana o cada mes, dependiendo del
directorio.
Para que el archivo pueda ser ejecutado tiene que ser algo similar a lo siguiente:
#!/bin/sh
#script que genera un respaldo
cd /usr/documentos
tar czf * respaldo
cp respaldo /otra_directorio/.

Nótese que la primera línea empieza con #!, que indica que se trata de un script
shell de bash, las demás líneas son los comandos que deseamos ejecute el script.
Este script podría nombrarse por ejemplo respaldo.sh y también debemos cambiarle
los permisos correspondientes para que pueda ser ejecutado, por ejemplo:
#> chmod 700 respaldo.sh
#> ls -l respaldo.sh
-rwx------ 1 root root 0 Jul 20 09:30 respaldo.sh

La "x" en el grupo de permisos del propietario (rwx) indica que puede ser ejecutado.
Si este script lo dejamos en cron.hourly, entonces se ejecutará cada hora de todos
los días
Como segundo modo de ejecutar o usar cron es a través de manipular directamente
el archivo /etc/crontab. En la instalación por defecto de varias distribuciones Linux,
este archivo se verá a algo como lo siguiente:

#> cat /etc/crontab


SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

Las primeras cuatro líneas son variables que indican lo siguiente:


SHELL es el 'shell' bajo el cual se ejecuta el cron. Si no se especifica, se tomará por
defecto el indicado en la línea /etc/passwd correspondiente al usuario que este
ejecutando cron.
PATH contiene o indica la ruta a los directorios en los cuales cron buscará el
comando a ejecutar. Este path es distinto al path global del sistema o del usuario.
MAIL TO es a quien se le envía la salida del comando (si es que este tiene alguna
salida). Cron enviará un correo a quien se especifique en este variable, es decir,
debe ser un usuario válido del sistema o de algún otro sistema. Si no se especifica,
entonces cron enviará el correo al usuario propietario del comando que se ejecuta.
HOME es el directorio raíz o principal del comando cron, si no se indica entonces, la
raíz será la que se indique en el archivo /etc/passwd correspondiente al usuario que
ejecuta cron.
Los comentarios se indican con # al inicio de la línea.
Después de lo anterior vienen las líneas que ejecutan las tareas programadas
propiamente. No hay límites de cuantas tareas pueda haber, una por renglón.

Linux es un sistema multiusuario y cron es de las aplicaciones que soporta el


trabajo con varios usuarios a la vez. Cada usuario puede tener su propio archivo
crontab, de hecho el/etc/crontab se asume que es el archivo crontab del usuario
root, aunque no hay problema que se incluyan otros usuarios, y de ahí el sexto
campo que indica precisamente quien es el usuario que ejecuta la tarea y es
obligatorio en /etc/crontab.

Pero cuando los usuarios normales (e incluso root) desean generar su propio archivo
de crontab, entonces utilizaremos el comando crontab.

Vamos empezando con un ejemplo simple.Vamos a automatizar la actualización de


un sistema, para eliminar lo de “siempre tengo que andar actualizando y eso no me
gusta!”.

Primero que nada haremos un script. Este script será llamado por cron y contendrá
todas las instrucciones que queremos que haga, por lo tanto es necesario probarlo
en varios casos y de varias formas antes de incluirlo a cron, un sencillo script de
actualizacion como este:

#!/bin/bash
#script ejemplo de actualizacion
#elija su distribucion
#debian-ubuntu
#apt-get update & apt-get -y upgrade
#fedora
#yum -y update
#Arch
#pacman --noconfirm -Syu
Quitale el # a la línea de tu distro. En caso de que sea Ubuntu/Debian, a la que
empieza con apt-get.

Guardamos el script como actualizacion.sh (ej. directorio scripts tu home).


Cambiamos los permisos de ejecución del script con:

chmod a+x ~/scripts/actualizacion.sh

Ejecutamos el script un par de veces para verificar que todo ejecute sin problemas,
modificamos lo necesario (no debe contener errores, si no cron solo repetira un
error una y otra vez). Ahora a agregar la tarea a nuestro crontab.

Agregar tareas a crontab

Ejecutamos la edición del crontab con crontab -e, en algunas distros (como ubuntu)
nos da la opcion de elegir el editor de textos que deseemos. El archivo crontab
lucirá algo asi.

# m h dom mon dow user command

donde:

•m corresponde al minuto en que se va a ejecutar el script, el valor va de 0


a 59

•h la hora exacta, se maneja el formato de 24 horas, los valores van de 0 a


23, siendo 0 las 12:00 de la medianoche.

•dom hace referencia al día del mes, por ejemplo se puede especificar 15 si
se quiere ejecutar cada dia 15

•mon Mes en que el comando se ejecutará, puede ser indicado


numéricamente (1-12), o por el nombre del mes en inglés, solo las
tres primeras letras.
•dow significa el día de la semana, puede ser numérico (0 a 7, donde 0 y 7
son domingo) o las 3 primeras letras del día en inglés: mon, tue, wed, thu,
fri, sat, sun.

•user define el usuario que va a ejecutar el comando, puede ser root, u


otro usuario diferente siempre y cuando tenga permisos de ejecución del
script.

•command refiere al comando o a la ruta absoluta del script a ejecutar,


ejemplo:/home/usuario/scripts/actualizar.sh, si acaso llama a un script
este debe ser ejecutable

Para que quedara claro unos cuantos ejemplos de tareas de cron explicados:

15 10 * * * usuario /home/usuario/scripts/actualizar.sh

Ejecutará el script actualizar.sh a las 10:15 a.m. todos los días

15 22 * * * usuario /home/usuario/scripts/actualizar.sh

Ejecutará el script actualizar.sh a las 10:15 p.m. todos los días

00 10 * * 0 root apt-get -y update Usuario root

Ejecutará una actualización todos los domingos a las 10:00 a.m

45 10 * * sun root apt-get -y update

Usuario root ejecutará una actualización todos los domingos (sun) a las 10:45 a.m

30 7 20 11 * usuario /home/usuario/scripts/actualizar.sh

El día 20 de noviembre a las 7:30 el usuario correra el script

30 7 11 11 sun usuario /home/usuario/scripts/pastel_con_velitas.sh


El día 11 de noviembre a las 7:30 a.m. y que sea domingo, el usuario felicitará a su
sysadmin

01 * * * * usuario /home/usuario/scripts/molestorecordatorio.sh

Un molesto recordatorio cada minuto de cada hora todos los días (NO
recomendable).

Se pueden manejar rangos especiales:

30 17 * * 1,2,3,4,5

A las 5:30 de la tarde todos los días de lunes a viernes.

00 12 1,15,28 * *

A las 12 del día todos los días primero, quince y 28 de cada mes (ideal para
nóminas)

Si esto resulta confuso, crontab maneja cadenas especiales para definir estos
rangos.

@reboot Ejecuta una vez, al inicio


@yearly ejecuta sólo una vez al año: 0 0 1 1 *
@annually igual que @yearly
@monthly ejecuta una vez al mes, el día primero: 0 0 1 * *
@weekly Semanal el primer minuto de la primer hora de la semana. 0 0 * * 0″.
@daily diario, a las 12:00A.M. 0 0 * * *
@midnight igual que @daily
@hourly al primer minuto de cada hora: 0 * * * *
Su uso es muy sencillo.

@hourly usuario /home/usuario/scripts/molestorecordatorio.sh

@monthly usuario /home/usuario/scripts/respaldo.sh

@daily root apt-get update && apt-get -y upgrade

Por último y no menos importante:

Administracion de trabajos en cron

crontab archivo

Remplaza el existente archivo crontab con un archivo definido por el usuario

crontab -e

Editar el archivo crontab del usuario, cada linea nueva sera una nueva tarea de
crontab.

crontab -l

Lista todas las tareas de crontab del usuario

crontab -d

Borra el crontab del usuario

crontab -c dir

Define el directorio de crontab del usuario (este debe tener permisos de escritura y
ejecucion del usuario)
crontab -u usuario

prefijo para manejar el crontab de otro usuario, ejemplos:

$ sudo crontab -l -u root

$ sudo crontab -e usuario2

#crontab -d -u usuario

Más ejemplos:
EJERCICIOS

1. Programa una tarea que cada 5 minutos escriba la fecha y hora del sistema (comando date) en un
fichero.

2. Programa una tarea que cada hora haga un tar, comprimido con gzip, de su /etc (tar czvf
paq.tat.gz /etc)y que lo guarde en /backup.

3. Programa una tarea que imprima en todos los terminales (“Viva Ubuntu”) todos los dias a las
19:35 (echo “Viva Ubuntu” | wall)

4. La anterior pero sólo los viernes de meses impares.

5. Programa una tarea dentro de cinco minutos de la hora y fecha actuales, con crontab que cree un
fichero sin contenido llamado file_temp en tu directorio HOME. Dicha tarea se debe realizar
siempre a esta hora de Lunes a Viernes los meses de verano (Junio, Julio, Agosto, Septiembre)

6. Define una tarea que apague el equipo (poweroff) todos los días a las 23:59h.

7. Programa una tarea que cada 20 minutos muestre un mensaje con el texto, Descansa y navega
un rato. Instala gxmessage e incluye esto en cron: export DISPLAY=:0 && gxmessage texto

También podría gustarte