Programar la ejecución de comandos

crontab: reportar o editar su archivo crontab

crontab es un comando que le permite ejecutar comandos a intervalos de tiempo regulares, con la ventaja adicional que no tiene que estar conectado al sistema y que el reporte de salida se le envía por correo electrónico. Los intervalos se pueden especificar en minutos, horas, días, e incluso meses. Dependiendo de las opciones, crontab actuará diferentemente:

  • -l: Mostrar su archivo crontab corriente.

  • -e: Editar su archivo crontab.

  • -r: Eliminar su archivo crontab corriente.

  • -u <usuario>: Aplicar una de las opciones de arriba para el usuario <usuario>. Sólo root puede hacer esto.

Comencemos editando un crontab. Si ingresa crontab -e, estará frente a su editor de texto favorito si tiene definida la variable de entorno EDITOR o la variable de entorno VISUAL, en caso contrario se usará Vi. Una línea de un archivo crontab se compone de seis campos. Los primeros cinco campos son los intervalos de tiempo para los minutos, horas, días en el mes, meses y días en la semana. El sexto campo es el comando a ejecutar. Las líneas que comienzan con un # se consideran como comentarios y serán ignoradas por crond (el programa que es responsable de ejecutar los archivos crontab). Aquí tiene un ejemplo de crontab:

[Note]Nota

Para poder imprimir lo que sigue con una tipografía legible, tenemos que separar las líneas largas. Por lo tanto, algunos trozos deben ser ingresados en una única línea. Cuando se pone el caracter \ al final de una línea, esto significa que la línea continua debajo. Esta convención funciona en los archivos Makefile y en el shell, así como también en otros contextos.

# Si no quiere recibir correo electrónico simplemente
#   ponga una almohadilla al comienzo de la siguiente línea
#MAILTO="su_dirección_electrónica"
#
# Hacer un reporte de todas las imágenes nuevas a
#   las 14 hs. cada dos días, desde el ejemplo de
#   arriba - después de eso, "retocar" el archivo de
#   "estampa". El "%" se considera como una línea
#   nueva, esto le permite poner varios comandos
#   en una misma línea.
0 14 */2 * *  find /shared/images              \
-cnewer /shared/images/stamp                 \
-a -iregex ".*\.jpe?g"                       \
-a -not -regex                               \
".*/old/.*"%touch /shared/images/stamp
#
# Cada Navidad, reproducir una melodía :)
0 0 25 12 * mpg123 $HOME/canciones/feliz_navidad.mp3
#
# Imprimir la lista de compras cada martes a las 17 hs...
 0 17 * * 2 lpr $HOME/lista_de_compras.txt

Hay muchas otras maneras de especificar los intervalos aparte de las que se muestran en este ejemplo. Por ejemplo, puede especificar un conjunto de valores discretos separados por comas (1,14,23) o un rango (1-15), o incluso una combinación de ambos (1-10,12-20), o con un paso opcional (1-12,20-27/2) ¡Ahora queda en sus manos encontrar comandos útiles para poner!

at: Programar un comando, pero solo una vez

También podría querer ejecutar un comando un día dado, pero no regularmente. Por ejemplo, quiere que se le recuerde de una cita, hoy a las 18 horas. Usted emplea X, el paquete X11R6-contrib está instalado, y quiere que se le notifique, por ejemplo, a las 17:30 hs. que debe irse. at es lo que Usted quiere aquí:

$ at 5:30pm
# Ahora está frente al prompt "at"
at> xmessage "¡Hora de irse! Cita a las 18"
# Presione C-d para
at> <EOT>
$

Se puede especificar la hora de diferentes maneras:

  • now +<intervalo>: Significa eso, ahora, más un intervalo (Opcional. Si no se especifica el intervalo significa ahora mismo). La sintaxis para el intervalo es <n> (minutes|hours|days|weeks|months) (minutos|horas|días|semanas|meses ; sólo en inglés). Por ejemplo, puede especificar now + 1 hour (dentro de una hora), now + 3 days (dentro de tres días) y así sucesivamente.

  • <hora> <día>: Especificar la fecha por completo. El parámetro <hora> es obligatorio. at es muy liberal en lo que acepta: por ejemplo, puede ingresar 0100, 04:20, 2am, 0530pm, 1800, o uno de los tres valores especiales: noon (mediodía), teatime (la hora del té, 16 hs.) o midnight (medianoche). El parámetro <día> es opcional. También puede especificarlo de diferentes maneras: 12/20/2001 por ejemplo, notación americana para el 20 de diciembre de 2001, o, a la europea, 20.12.2001. Puede omitir el año, pero entonces sólo se acepta la notación europea: 20.12. También puede especificar el mes por su abreviatura en inglés: Dec 20 o 20 Dec son ambos válidos.

at también acepta opciones diferentes:

  • -l: Imprime la lista de los trabajos que están programados; el primer campo es el número de trabajo. Esto es equivalente al comando atq.

  • -d <n>: Quita el trabajo número <n> de la lista. Puede obtener los números de los trabajos con el comando atq o con la opción anterior. Esto es equivalente al comando atrm <n>.

Como siempre, consulte la página Man at(1) para más opciones.