cron es un programa daemon (demonio) que sirve para ejecutar tareas programadas según una combinación de la hora, día del mes, mes, día de la semana y semana.
Su comportamiento esta regulado por su archivo de configuración, que se llama crontab. Cada usuario del sistema posee un archivo crontab personalizado y sólo el usuario root puede modificar el archivo crontab de otro usuario.
¿Qué usos le podemos dar a Crontab?
* Darnos mensajes para recordarnos eventos, cosas importantes que no debemos olvidar, programando esto por pantalla o también podemos auto-enviarnos un email.
* Apagar un equipo a la hora que nosotros queramos, por ejemplo, nos vamos a dormir y dejamos la computadora bajando cosas de internet y le decimos que a las 3 de la mañana se apague automáticamente.
* En el caso de servidores, algo muy útil es el auto envió de estado de los sistemas, si tienes muchos servidores, puedes realizar escaneos con diferentes herramientas como nmap, tripwire etc y auto-enviarte esos datos en vez de correrlos todos los días sobre los sistemas que administres para ver si hubo intrusiones, limpieza de la base de datos, limpieza del espacio en disco, exploración en busca de virus, limpieza de la memoria temporal o “caché”, rotación de los archivos de registro, auto publicación de RSSs, etc.
* Para realizar backups, se puede programar un cron que a cierta hora de cierto dia de la semana realize un backup de todos los datos que creas necesarios.
Es importante aclarar, cron asume que el sistema está activo de forma continua (servidor). Si el sistema no está activo cuando está ́ programada una tarea, la tarea no se realizará.
Para configurar las tareas en función de los períodos, debe utilizar anacron. Para programar las tareas contemporáneas, use el comando at, el mismo se usa para programar una única tarea en un tiempo específico.
Archivo crontab
El fichero de configuración principal de cron, /etc/crontab, contiene las siguientes líneas:
En este ejemplo se programa el apagado del PC, todos los sábados a las 21.30
30 21 * * 6 root /sbin/shutdown -h now
Cada línea del fichero /etc/crontab tiene el formato siguiente:
# m h dom mon dow user command
(minute) (hour) (day of month) (month) (day of week) (command)
m (minute) – número entero entre 0 y 59
h (hour) – número entero entre 0 y 23
dom (day of month) – número entero entre 1 y 31 (debe ser un día válido)
mon (month) – número entero entre 1 y 12 (o nombre corto del mes, por ejemplo, ene, feb, etc.)
dow (day of week) – número entero entre 0 y 7, donde 0 o 7 corresponde a Domingo (o el nombre corto del día de la semana, por ejemplo, dom, lun, etc.)
user - usuario que ejecutará el comando
command – el comando a ejecutar (el comando puede ser uno tal como ls /proc >> /tmp/proc o el comando para ejecutar un script personalizado que usted haya escrito.)
En cualquiera de los valores antes indicados, se puede utilizar un asterisco (*) para especificar todos los valores válidos. Por ejemplo, un asterisco para el valor de mes significa que el comando se ejecutará ́ cada mes dentro de las limitaciones del resto de los valores.
Un guión (-) entre los números enteros indica un intervalo de números enteros.
Por ejemplo, 1-4 significa los números 1, 2, 3 y 4.
Valores separados por comas (,) especifican una lista. Por ejemplo 3, 4, 6, 8
La barra (/) puede utilizarse para especificar valores de pasos. El valor de un número entero se puede omitir dentro de un intervalo si se indica a continuación del intervalo lo siguiente /<número entero>. Por ejemplo, 0-59/2 puede usarse para definir el resto de los minutos del campo minuto.
Los valores de pasos también pueden utilizarse con un asterisco. Por ejemplo, el valor */3 puede usarse en el campo de mes para omitir el tercer mes.
Las líneas que empiezan por almohadilla (#) son comentarios y no se procesan.
Como podrá ́ observar en el archivo /etc/crontab, usa el script run-parts para ejecutar los scripts en los directorios /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, y /etc/cron.monthly cada hora, día, semana o mes, respectivamente. Los ficheros de estos directorios deben ser scripts de shell.
Veamos algunos ejemplos:
Todos los días a las 6 en punto de la tarde:
0 18 * * * usuario comando
Todos los jueves a las 2:30 de la mañana:
30 2 * * 4 usuario comando
Cada 15 minutos de 7 a 9 de la tarde:
*/15 19-21 * * * usuario comando
Cada 5 minutos durante la primera media hora de cada Sábado:
0-30/5 0 * * 5 usuario comando
El día 15 y 21 de cada mes a las 4 de la mañana:
0 4 15,21 * * usuario comando
El 25 de Septiembre a las 10 de la noche y sólo si es martes:
0 22 25 9 2 usuario comando
Para definir intervalos de tiempo podemos utilizar el /intervalo, por ejemplo:
Cada 5 minutos:
*/5 * * * * /usr/bin/denyhosts.sh
Cada 4 horas a en punto:
0 */4 * * * /usr/local/bin/mksnap
En este caso debemos tener cuidado con el siguiente, ya que esto significa: "Cada minuto de la hora cada cuatro horas" por lo que cada 4 horas se ejecutaría cada minuto de esa hora.
* */4 * * * /usr/local/bin/mksnap
Para indicar algunas horas sueltas sin intervalo sería, por ejemplo a las 2:00, a las 3:00 y a las 7:00 podemos separar los elementos por comas:
0 2,3,7 * * * /usr/local/bin/mksnap
Igual se pueden manejar rangos especiales:
A las 5:30 de la tarde todos los días de lunes a viernes.
30 17 * * 1,2,3,4,5 usuario comando
A las 12 del día todos los días primero, quince y 28 de cada mes (ideal para nóminas)
00 12 1,15,28 * * usuario comando
Control de acceso a Cron
Los ficheros /etc/cron.allow y /etc/cron.deny se usan para restringir el acceso a cron.
Un usuario sólo puede hacer uso de cron si su nombre aparece en:
/etc/cron.allow
Si este archivo no existe, el usuario puede usar crontab a menos que su nombre aparezca en:
/etc/cron.deny
El formato de los dos ficheros de acceso es un nombre de usuario en cada línea. No está permitido espacio en blanco en ninguno de los ficheros. El demonio cron (crond) no deber ser reiniciado si los ficheros de control de acceso se modifican. Los ficheros de control de acceso se leen cada vez que el usuario intenta añadir o borrar una tarea cron.
con este comando agregamos al usuario alband a la lista de usuarios denegados, si el fichero no existe será creado.
echo alband >> /etc/cron.deny
tratamos ahora de agregar una tarea con ese usuario y vemos que ya no se puede
El usuario root puede utilizar siempre cron, sin prestar atención a los nombres de usuarios listados en los ficheros de control de acceso.
Usuarios normales
Los usuarios no root pueden configurar las tareas programadas con crontab. Todos los crontabs definidos por el usuario se almacenan en el directorio /var/spool/cron/crontabs y se ejecutan utilizando los nombres de los usuarios que los han creado. Para crear un crontab como un usuario normal, inicie la sesión como ese usuario y escriba el comando crontab -e para modificar el crontab del usuario con el editor especificado por la variable de entorno VISUAL o EDITOR.
El fichero usa el mismo formato que /etc/crontab. Cuando se guardan los cambios en crontab, el crontab se almacena según el nombre de usuario, y se escribe en el fichero /var/spool/cron/crontabs/usuario.
El demonio cron controla el fichero /etc/crontab, el directorio /etc/cron.d/ y el directorio /var/spool/cron cada minuto para cada cambio. Si se encuentra algún cambio, estos se descargan en la memoria. De este modo, el demonio no necesita ser reiniciado si se cambia un fichero crontab.
Manejo general del comando
Para ver la tabla de tareas programadas:
crontab -l
Editar nuestras tareas programadas en el crontab:
crontab -e
Aquí se abrirá un editor de texto, tal vez vim, pico o emacs, según cual hayamos especificado como default. Desde el editor vamos a poder añadir lineas al fichero crontab, una linea por cada tarea que deseemos programar.
Borrar toda nuestra programación de tareas con:
crontab -r
Editar crontab de un usuario en particular
crontab [ -u usuario ] archivo
crontab [ -u usuario ] { -l | -r | -e }
La opción -u se utiliza para indicar el crontab de usuario que queremos administrar sólo root podrá usar la orden crontab con esta opción.
Ejemplo simple de backup
Si quieres respaldar todas tus Descargas para que no se te pierdan por cualquier cosa. Para ello vamos a realizar la operación de la siguiente forma:
Haremos un tar.gz del directorio "Descargas"
crontab -e
30 15 * * * tar -cvpzf /home/usuario/backup.tar.gz /home/usuario/Descargas/
crontab también maneja cadenas especiales para definir rangos.
@reboot Ejecuta cuando inicia el pc
@yearly ejecuta sólo una vez al año, es ugual a 0 0 1 1 *
@annually igual que @yearly
@monthly ejecuta una vez al mes, el día primero, es ugual a 0 0 1 * *
@weekly Semanal el primer minuto de la primer hora de la semana, es ugual a 0 0 * * 0″.
@daily diario, a las 12:00A.M., es ugual a 0 0 * * *
@midnight igual que @daily
@hourly al primer minuto de cada hora, es ugual a 0 * * * *
Su uso es muy sencillo.
@hourly usuario /home/usuario/scripts/recordatorio.sh
@daily root apt-get update && apt-get -y upgrade
Descarga de la distribución Debian "testing" (se generan semanalmente)
@monthly usuario wget -q -O http://cdimage.debian.org/cdimage/weekly-builds/multi-arch/iso-dvd/debian-testing-i386-amd64-source-DVD-1.iso
ejemplo para realizar un backup de un pc que no sabemos con certeza a que hora estará encendido, podemos hacer que se realice la operación cuando arranca el sistema.
@reboot alband tar -cvpzf /home/alband/backup.tar.gz /home/alband/Documentos/
Envío de email con exim
Vamos a instalar exim para que todos los usuarios puedan enviar reportes por email de sus actividades
Verificamos si esta instalado en el sistema
/usr/sbin/exim -i
si no sale este resultado hay que instalarlo
su
poner contraseña de root, a partir de ahora y en todo el tutorial vamos a trabajar como usuario root.
(Si estas en ubuntu, sudo su y pones tu propia contraseña)
apt-get install exim4
Luego pasamos a configurar exim
nano -wB /etc/exim4/update-exim4.conf.conf
Y realizamos las siguientes modificaciones para poder usar una cuenta de gmail existente.
Luego modificamos los datos de nuestra cuenta de gmail
nano /etc/exim4/passwd.client
verificamos si es root el propietario del archivo editado antes.
ls -l /etc/exim4/passwd.client
-rw-r----- 1 root Debian-exim 343 nov 13 19:50 /etc/exim4/passwd.client
Ahora reiniciamos exim
/etc/init.d/exim4 restart
enviamos un email para verificar que anda
who | mail -s "Usuarios conectados al servidor" [email protected]
Para depurar errores en configuraciones, o ver en más detalle que esta pasando, no existe mejor alternativa que ver los logs.
tail /var/log/exim4/mainlog
verificamos que el email se recibió
Algunos ejemplos para envío email
Todos los días a las 6 de la tarde, envía un email solamente si fallo el backup.
0 18 * * * root /home/bkp.sh 1>/dev/null || true | mail -s "Error de backup" [email protected]
de lunes a viernes a las 17:30 hs
30 17 * * 1,2,3,4,5 root df -h | mail -s "Espacio libre en server" [email protected]
lunes miercoles y viernes a las 13:30 hs
30 13 * * 1,3,5 root last -n 10 | mail -s "ultimos 10 usuarios que se han logueado" [email protected]
Más ejemplos funcionales
Usuario root ejecutará una actualización todos los domingos (sun) a las 10:45 a.m
45 10 * * sun root apt-get -y update
Se cierra la navegación a las 18 hs
0 18 * * * root iptables -P INPUT DROP
Cada dia a las 0:00
0 0 * * * /var/qmail/bin/qmail-scanner-queue.pl -z
Cada domingo a las 6:30
30 6 * * 0 /usr/local/bin/optimize.mysql.sh
______________________________________________________________
Si te gusto el post comenta!
Estas sin tiempo para leerlo detenidamente? Agregalo a favoritos ya!
No entendiste algo? mandame un MP que te ayudo.
Te gustan mis aportes? Seguime! no te defraudaré.
Fuentes de conocimientos:
http://www.linuxtotal.com.mx/index.php?cont=info_admon_006
exim
bash