107.2 Lección 1
Certificación: |
LPIC-1 |
---|---|
Versión: |
5.0 |
Tema: |
107 Tareas administrativas |
Objetivo: |
107.2 Automatizar tareas administrativas del sistema mediante la programación de trabajos |
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 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 disposició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 del 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.
En cuanto a los crontabs de usuario, puede especificar 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 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 crones 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
Con el DayOfWeek
siendo opcional. 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. Para la especificación DayOfWeek
, puede usar las tres primeras letras del nombre o el nombre completo.
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 "journalalctl". 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
.