107.2 Lección 1
Certificación: |
LPIC-1 |
---|---|
Versión: |
5.0 |
Tema: |
107 Tareas Administrativas |
Objetivo: |
107.2 Automatización de tareas por medio del sistema programado |
Lección: |
1 de 2 |
Introducción
Automatizar las tareas regulares del
sistema mediante la programación de
trabajos (o Jobs) es una de las cosas más
importantes que un buen administrador debe
hacer. Por ejemplo, un administrador puede
crear y automatizar trabajos para copias
de seguridad, actualizaciones del sistema
y para realizar muchas otras actividades
repetitivas. Para ello puede utilizar la
función cron
, que es útil
para automatizar la programación periódica
de trabajos.
Programar trabajos con Cron
En sistemas Linux, cron
es un demonio que se ejecuta
continuamente y se activa cada minuto
para comprobar un conjunto de tablas en
busca de tareas a ejecutar. Estas tablas
se conocen como crontabs y
contienen las llamadas cron jobs.
Cron es adecuado para servidores y
sistemas que están encendidos
constantemente, porque cada trabajo de
cron se ejecuta sólo si el sistema se
está ejecutando a la hora programada.
Puede ser utilizado por usuarios
ordinarios, cada uno de los cuales tiene
su propio crontab
, así
como el usuario root que gestiona los
crontabs del sistema.
Note
|
En Linux también existe la
utilidad |
Crontabs de usuario
Los crontabs de usuario son archivos de
texto que gestionan la programación de
los trabajos cron definidos por el
usuario. Siempre tienen el nombre de la
cuenta de usuario que los creó, pero la
ubicación de estos archivos depende de
la distribución utilizada (generalmente
un subdirectorio de /var/spool/cron
).
Cada línea en un crontab de usuario contiene seis campos separados por un espacio:
-
El minuto de la hora (0-59).
-
La hora del día (0-23).
-
El día del mes (1-31).
-
El mes del año (1-12).
-
El día de la semana (0-7 con domingo=0 o domingo=7).
-
La orden a ejecutar.
Para el mes del año y el día de la
semana puede usar las tres primeras
letras del nombre (en inglés) en lugar
del número correspondiente.
Los primeros cinco campos indican cuándo ejecutar el comando que se especifica en el sexto campo, y pueden contener uno o más valores. En particular, se pueden especificar múltiples valores utilizando:
*
(asterisco)-
Se refiere a cualquier valor.
,
(coma)-
Especifica una lista de posibles valores.
-
(guión)-
Especifica un rango de valores posibles.
/
(slash)-
Especifica valores escalonados.
Muchas distribuciones incluyen el
archivo /etc/crontab
que
puede ser usado como referencia para la
creación de un archivo cron
.
A continuación se muestra un ejemplo de
archivo /etc/crontab
de
una instalación de Debian:
SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
Crontabs de sistema
Los crontabs de sistema son archivos de
texto que gestionan la programación de
los trabajos del cron del sistema y sólo
pueden ser editados por el usuario root.
El archivo /etc/crontab
y
todos los que se encuentran en el
directorio /etc/cron.d
son
crontabs del sistema.
La mayoría de las distribuciones
también incluyen los directorios /etc/cron.hourly
,
/etc/cron.daily
, /etc/cron.weekly
y /etc/cron.monthly
que
contienen scripts para ser ejecutados
con la frecuencia apropiada. Por
ejemplo, si quiere ejecutar un script
diariamente puede colocarlo en /etc/cron.daily
.
Warning
|
Algunas distribuciones usan |
La sintaxis de los crontabs del sistema es similar a la de los crontabs de los usuarios, sin embargo, también requiere un campo obligatorio adicional que especifica qué usuario ejecutará el trabajo de cron. Por lo tanto, cada línea de un crontab de sistema contiene siete campos separados por un espacio:
-
El minuto de la hora (0-59).
-
La hora del día (0-23).
-
El día del mes (1-31).
-
El mes del año (1-12).
-
El día de la semana (0-7 con domingo=0 o domingo=7).
-
El nombre de la cuenta de usuario que se utilizará al ejecutar el comando.
-
El comando a ejecutar.
Al igual que los crontabs de usuarios,
los crontabs del sistema admiten
múltiples valores para los campos de
tiempo usando los operadores *
,
,
, -
y /
.
También puede indicar el mes y el día de
la semana con las tres primeras letras
del nombre (en inglés) en lugar del
número correspondiente.
Especificaciones de tiempo particulares
Al editar los archivos crontab, también puede usar atajos especiales en las primeras cinco columnas en lugar de las especificaciones de tiempo:
@reboot
-
Ejecutar la tarea especificada una vez después de reiniciar.
@hourly
-
Ejecutar la tarea especificada una vez por hora al iniciar.
@daily
(o@midnight
)-
Ejecutar la tarea especificada una vez al día a medianoche.
@weekly
-
Ejecutar la tarea especificada una vez a la semana a medianoche del domingo.
@monthly
-
Ejecutar la tarea especificada una vez al mes a la medianoche del primer día del mes.
@yearly
(o@annually
)-
Ejecutar la tarea especificada una vez al año a medianoche del 1 de enero.
Variables de Crontab
En ocasiones, dentro de un archivo crontab, hay variables definidas antes de que se declaren las tareas programadas. Las variables de entorno establecidas (comúnmente) son:
HOME
-
El directorio donde
cron
invoca los comandos (por defecto el directorio principal del usuario). MAILTO
-
El nombre del usuario o la dirección a la que se envía la salida estándar y el error (por defecto, el propietario del crontab). También se permiten múltiples valores separados por comas y un valor vacío indica que no se debe enviar ningún correo.
PATH
-
La ubicación de los comandos en los sistemas de archivos.
SHELL
-
El shell a usar (por defecto
/bin/sh
).
Crear trabajos en un cron de usuario
El comando crontab
se usa
para mantener los archivos crontab
para usuarios individuales. En
particular, puede ejecutar el comando crontab
-e
para editar su propio
archivo crontab o para crear uno si aún
no existe.
$ crontab -e no crontab for frank - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano < ‑‑‑‑ easiest 3. /usr/bin/emacs24 4. /usr/bin/vim.tiny Choose 1-4 [2]:
Por defecto, el comando crontab
abre el editor especificado por las
variables de entorno VISUAL
o EDITOR
para que pueda
empezar a editar su archivo crontab
con su preferido. Algunas
distribuciones, como se muestra en el
ejemplo anterior, le permiten elegir el
editor de una lista cuando crontab
se ejecuta por primera vez.
Si quiere ejecutar el script foo.sh
ubicado en su directorio principal todos
los días a las 10:00 am, puede agregar
la siguiente línea a su archivo crontab:
0 10 * * * /home/frank/foo.sh
Considere los siguientes ejemplos de entradas en el crontab:
0,15,30,45 08 * * 2 /home/frank/bar.sh 30 20 1-15 1,6 1-5 /home/frank/foobar.sh
En la primera línea, el script bar.sh
se ejecuta todos los martes a las 08:00
am, a las 08:15 am, a las 08:30 am y a
las 08:45 am. En la segunda, línea el
script foobar.sh
se
ejecuta a las 08:30 pm de lunes a
viernes durante los primeros quince días
de enero y junio.
Warning
|
Aunque los archivos crontab
pueden ser editados
manualmente, siempre se
recomienda usar el comando |
Además de la opción -e
mencionada anteriormente, el comando crontab
tiene otras opciones útiles:
-l
-
Muestra el crontab actual en la salida estándar.
-r
-
Quita el crontab actual.
-u
-
Especifica el nombre del usuario cuyo crontab necesita ser modificado. Esta opción requiere privilegios de root y permite que el usuario root edite los archivos crontab de otro usuario.
Crear archivos cron de sistema
A diferencia de los crontabs de
usuario, los crontabs de sistema se
actualizan usando un editor: por lo
tanto, no es necesario ejecutar el
comando crontab
para
editar /etc/crontab
y los
archivos en /etc/cron.d
.
Recuerde que cuando edite los crontabs
del sistema, debe especificar la cuenta
que se usará para ejecutar el trabajo
cron (normalmente el usuario root).
Por ejemplo, si quiere ejecutar el
script barfoo.sh
ubicado
en el directorio /root
todos los días a la 01:30 am, puede
abrir /etc/crontab
con su
editor preferido y agregar la siguiente
línea:
30 01 * * * root /root/barfoo.sh >>/root/output.log 2>>/root/error.log
En el ejemplo anterior, la salida del
job se añade a /root/output.log
,
mientras que los errores se añaden a /root/error.log
.
Warning
|
A menos que la salida sea
redirigida a un archivo como
en el ejemplo anterior (o que
la variable |
Configurar el acceso a la programación de tareas
En Linux los archivos /etc/cron.allow
y /etc/cron.deny
se usan
para establecer las restricciones crontab
.
En particular, se usan para permitir o
no la programación de trabajos cron para
diferentes usuarios. Si existe el
archivo /etc/cron.allow
,
sólo los usuarios no root listados
dentro de él pueden programar trabajos
cron usando el comando crontab
.
Si /etc/cron.allow
no
existe pero /etc/cron.deny
existe, sólo los usuarios no root
listados dentro de este archivo no
pueden programar trabajos cron usando el
comando crontab
(en este
caso un /etc/cron.deny
vacío significa que a cada usuario se le
permite programar trabajos cron con crontab
).
Si no existe ninguno de estos archivos,
el acceso del usuario a la programación
de trabajos cron dependerá de la
distribución utilizada.
Note
|
Los archivos |
Una alternativa a cron
Usando systemd como el administrador
del sistema y del servicio, puede
establecer timers como una
alternativa a cron
para
programar sus tareas. Los temporizadores
son archivos de unidad systemd
identificados por el sufijo .timer
,
y para cada uno de ellos debe haber un
archivo de unidad correspondiente que
describa la unidad que se activará
cuando el temporizador transcurra. Por
defecto, un timer
activa
un servicio con el mismo nombre, excepto
por el sufijo.
Un temporizador incluye una sección de
[Timer]
que especifica
cuándo deben ejecutarse los trabajos
programados. Específicamente, puede usar
la opción OnCalendar=
para
definir temporizadores en tiempo
real que funcionan de la misma
manera que los trabajos cron (están
basados en expresiones de eventos de
calendario). La opción OnCalendar=
requiere la siguiente sintaxis:
DayOfWeek Year-Month-Day Hour:Minute:Second
DayOfWeek
es opcional pero
si se indica debe ser siempre con las
tres primeras letras del dia de la
semana en inglés. Para el resto de la
línea los operadores *
, /
y ,
tienen el mismo
significado que los usados para los
trabajos de cron, mientras que puede
usar ..
entre dos valores
para indicar un rango contiguo.
Note
|
También se pueden definir temporizadores monótonos que se activan después de transcurrir un tiempo desde un punto de inicio específico (por ejemplo, cuando inicia máquina o cuando se activa el propio temporizador). |
Por ejemplo, si quiere ejecutar el
servicio llamado /etc/systemd/system/foobar.service
a las 05:30 del primer lunes de cada
mes, puede añadir las siguientes líneas
en el archivo correspondiente de la
unidad /etc/systemd/system/foobar.timer
.
[Unit] Description=Run the foobar service [Timer] OnCalendar=Mon *-*-1..7 05:30:00 Persistent=true [Install] WantedBy=timers.target
Una vez que haya creado el nuevo temporizador, puede activarlo e iniciarlo ejecutando los siguientes comandos como root:
# systemctl enable foobar.timer # systemctl start foobar.timer
Puede cambiar la frecuencia de su
trabajo programado, modificando el valor
OnCalendar
y luego
escribiendo el comando Systemctl
daemon-reload
.
Finalmente, si quiere ver la lista de
temporizadores activos ordenados por el
tiempo que transcurre a continuación,
puede usar el comando systemctl
list-timers
. Puede añadir la
opción --all
para ver
también las unidades de temporizadores
inactivos.
Note
|
Recuerda que los temporizadores se registran en el diario del sistema (system journal) y puede revisar los registros de las diferentes unidades usando el comando "journalctl". Recuerde también que si esta utilizando un usuario ordinario, necesita usar la opción "user" de los comandos "systemctl" y "journalctl". |
En lugar de la formas mencionadas anteriormente, se pueden utilizar algunas expresiones especiales que describen frecuencias particulares para la ejecución del trabajo:
hourly
-
Ejecutar la tarea especificada una vez por hora al comienzo de la hora.
daily
-
Ejecutar la tarea especificada una vez al día a medianoche.
weekly
-
Ejecutar la tarea especificada una vez a la semana a medianoche del lunes.
monthly
-
Ejecutar la tarea especificada una vez al mes a la medianoche del primer día del mes.
yearly
-
Ejecutar la tarea especificada una vez al año a medianoche del primer día de enero.
Puede ver las páginas de man para la
lista completa de especificaciones de
tiempo y fecha en systemd.timer(5)
.
Ejercicios guiados
-
Para cada uno de los siguientes atajos
crontab
, indique la especificación de tiempo correspondiente (es decir, las cinco primeras columnas de un archivocrontab
de usuario):@hourly
@daily
@weekly
@monthly
@annually
-
Para cada uno de los siguientes atajos
OnCalendar
, indique la especificación de tiempo correspondiente (la forma más larga):hourly
daily
weekly
monthly
yearly
-
Explique el significado de las siguientes especificaciones de tiempo que se encuentran en un archivo
crontab
:30 13 * * 1-5
00 09-18 * * *
30 08 1 1 *
0,20,40 11 * * Sun
00 09 10-20 1-3 *
*/20 * * * *
-
Explique el significado de las siguientes especificaciones de tiempo utilizadas en la opción
OnCalendar
de un archivo de temporizador:*-*-* 08:30:00
Sat,Sun *-*-* 05:00:00
*-*-01 13:15,30,45:00
Fri *-09..12-* 16:20:00
Mon,Tue *-*-1,15 08:30:00
*-*-* *:00/05:00
Ejercicios de exploración
-
Asumiendo que usted está autorizado a programar trabajos con
cron
como un usuario ordinario, ¿Qué comando usaría para crear su propio archivo crontab?
-
Cree un trabajo simple y programado que ejecute el comando
date
todos los viernes a la 01:00 pm. ¿Dónde puede ver la salida de este trabajo?
-
Cree otro trabajo programado que ejecute el script
foobar.sh
cada minuto, redirigiendo la salida al archivooutput.log
en su directorio de origen para que sólo se le envíe el error estándar por correo electrónico.
-
Mire la entrada
crontab
del nuevo trabajo programado. ¿Por qué no es necesario especificar la ruta absoluta del archivo en el que se guarda la salida estándar? ¿Y por qué puede usar el comando./foobar.sh
para ejecutar el script?
-
Edite la entrada anterior
crontab
eliminando la redirección de salida y desactive el primer trabajo cron que había creado.
-
¿Cómo puede enviar la salida y los errores de un trabajo programado a la cuenta de usuario
emma
por correo electrónico? ¿Y cómo puede evitar enviar la salida y los errores estándar por correo electrónico?
-
Ejecute el comando
ls -l /usr/bin/crontab
. ¿Qué bit especial se establece y cuál es su significado?
Resumen
En esta lección, aprendió:
-
Usar
cron
para ejecutar trabajos a intervalos regulares. -
Administrar los trabajos de "cron".
-
Configurar el acceso del usuario a la programación de trabajos cron.
-
Comprender el papel de las unidades de tiempo del sistema como una alternativa a
cron
.
Los siguientes comandos y archivos fueron discutidos en esta lección:
crontab
-
Mantener los archivos
crontab
para los usuarios individuales. /etc/cron.allow
y/etc/cron.deny
-
Archivos particulares usados para establecer restricciones
crontab
. /etc/crontab
-
Archivo crontab del sistema.
/etc/cron.d
-
El directorio que contiene los archivos crontab del sistema.
systemctl
-
Controla el sistema y el administrador del servicio. En relación con los temporizadores, se puede utilizar para habilitarlos e iniciarlos.
Respuestas a los ejercicios guiados
-
Para cada uno de los siguientes atajos
crontab
, indique la especificación de tiempo correspondiente (es decir, las cinco primeras columnas de un archivocrontab
de usuario):@hourly
0 * * * *
@daily
0 0 * * *
@weekly
0 0 * * 0
@monthly
0 0 1 * *
@annually
0 0 1 1 *
-
Para cada uno de los siguientes atajos
OnCalendar
, indique la especificación de tiempo correspondiente (la forma más larga):hourly
*-*-* *:00:00
daily
*-*-* 00:00:00
weekly
Mon *-*-* 00:00:00
monthly
*-*-01 00:00:00
yearly
*-01-01 00:00:00
-
Explique el significado de las siguientes especificaciones de tiempo para un archivo
crontab
:30 13 * * 1-5
A las 13:30 horas todos los días de la semana de lunes a viernes
00 09-18 * * *
Todos los días y cada hora desde las 09:00 hasta las 18:00
30 08 1 1 *
A las 08:30 horas del primer día de enero
0,20,40 11 * * Sun
Todos los domingos a las 11:00, 11:20 y 11:40
00 09 10-20 1-3 *
A las 09:00 horas del 10 al 20 de enero, febrero y marzo
*/20 * * * *
Cada veinte minutos
-
Explique el significado de las siguientes especificaciones de tiempo para un archivo
crontab
:*-*-* 08:30:00
Todos los días a las 08:30 am
Sat,Sun *-*-* 05:00:00
A las 05:00 am del sábado y el domingo
*-*-01 13:15,30,45:00
A las 01:15 pm, 01:30 pm y 01:45 pm del primer día del mes
Fri *-09..12-* 16:20:00
A las 04:20 pm todos los viernes de septiembre, octubre, noviembre y diciembre
Mon,Tue *-*-1,15 08:30:00
A las 8:30 de la mañana del primero o del decimoquinto día de cada mes, sólo si el día es un lunes o un martes.
*-*-* *:00/05:00
Cada cinco minutos
Respuestas a los ejercicios de exploración
-
Asumiendo que usted está autorizado a programar trabajos con
cron
como un usuario ordinario, ¿Qué comando usaría para crear su propio archivo crontab?dave@hostname ~ $ crontab -e no crontab for dave - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano < ---- easiest 3. /usr/bin/emacs24 4. /usr/bin/vim.tiny Choose 1-4 [2]:
-
Cree un trabajo simple y programado que ejecute el comando
date
todos los viernes a la 01:00 pm. ¿Dónde puede ver la salida de este trabajo?00 13 * * 5 date
La salida se envía por correo al usuario; para poder visualizarla, se puede utilizar el comando
mail
. -
Cree otro trabajo programado que ejecute el script
foobar.sh
cada minuto, redirigiendo la salida al archivooutput.log
en su directorio de origen para que sólo se le envíe el error estándar por correo electrónico.*/1 * * * * ./foobar.sh >> output.log
-
Mire la entrada
crontab
del nuevo trabajo programado. ¿Por qué no es necesario especificar la ruta absoluta del archivo en el que se guarda la salida estándar? ¿Y por qué puede usar el comando./foobar.sh
para ejecutar el script?cron
invoca los comandos desde el directorio home del usuario, a menos que se especifique otra ubicación por la variable de entornoHOME
dentro del archivocrontab
. Por esta razón, puede utilizar la ruta relativa del archivo de salida y ejecutar el script con./foobar.sh
. -
Edite la entrada anterior
crontab
eliminando la redirección de salida y desactive el primer trabajo cron que había creado.#00 13 * * 5 date */1 * * * * ./foobar.sh
Para deshabilitar un trabajo cron, puede simplemente comentar la línea correspondiente dentro del archivo
crontab
. -
¿Cómo puede enviar la salida y los errores de un trabajo programado a la cuenta de usuario
emma
por correo electrónico? ¿Y cómo puede evitar enviar la salida y los errores estándar por correo electrónico?Para enviar la salida estándar y el error a
emma
, debe establecer la variable de entornoMAILTO
en su archivocrontab
de la siguiente manera:MAILTO="emma"
Para especificarle a
cron
que no se debe enviar ningún correo, puede asignar un valor vacío a la variable de entornoMAILTO
.MAILTO=""
-
Ejecute el comando
ls -l /usr/bin/crontab
. ¿Qué bit especial se establece y cuál es su significado?$ ls -l /usr/bin/crontab -rwxr-sr-x 1 root crontab 25104 feb 10 2015 /usr/bin/crontab
El comando
crontab
tiene el bit SGID establecido (el caracters
en lugar del flag ejecutable para el grupo), lo que significa que se ejecuta con los privilegios del grupo (por lo tantocrontab
). Es por esto que los usuarios comunes pueden editar su archivocrontab
usando el comandocrontab
. Tenga en cuenta que muchas distribuciones tienen permisos de archivo establecidos de tal manera que los archivoscrontab
sólo pueden ser editados mediante el comandocrontab
.