En muchas ocasiones se deben realizar tareas en el sistema operativo que se pueden simplificar de forma repetitiva sin la necesidad de la presencia física de una persona utilizando tareas programadas. Para ello en Ubuntu existe un demonio para ejecutar tareas en segundo plano llamado cron. Este demonio ejecutara procesos según la programación que se indique, para lo cual se utiliza la utilizadad crontab

Crontab

Para poder gestionar las tareas a ejecutar se utiliza el archivo de configuraciones crontab, el cual guarda la programación de los comandos a ejecutar según un tiempo determinado. Hay que tener en cuenta que este crontab es por usuario, por lo que deberá indicarse el usuario que crea la tarea programada. Para poder empezar se ejecuta el comando crontab acompañado de alguna opción:

  • -l : lista las tareas programadas para el usuario logeado
  • -e : edita la lista de tareas programadas para el usuario logeado
  • -d: elimina la lista de tareas programadas para el usuario logeado
  • -u : indica un usuario determinado para trabajar con su lista de tareas programadas

En el caso de querer incluid una tarea programada al usuario logeado se ejecuta crontab -e abriéndoselo el archivo de tareas programadas. Aquí se indican los parámetros que se deben cumplir para que la tarea programada se ejecute siendo la estructura la siguiente:

# m h dom mon dow command

Donde:

  • m: minuto al que se quiere ejecutar la tarea. Se define en el rango de 0 a 59.
  • h: hora a la que se quiere ejecutar la tarea. Se define en formato 24h, por lo que el rango es de 0 a 23.
  • dom: día del mes al que se quiere ejecutar la tarea. Se define en el rango de 1 a 31.
  • mon: mes en el que se quiere que se ejecute la tarea. Se define en el rango de 1 a 12.
  • dow: dia de la semana en el que se quiere que se ejecute la semana. Se define en el rango de 0 a 7, teniendo en cuenta que 0 y 7 son domingo.
  • command: comando o script que se quiere ejecutar. Hay que tener en cuenta que se deben tener permisos de ejecución en el caso de los scripts (chmod +x /ruta/mish.sh)

Algún ejemplo sería:

# ejecución del script mish.sh a las 0horas 0minutos del día 1 del mes 1
0 0 1 1 * /scripts/mish.sh
# ejecución del script mish.sh a las 3h 0m todos los días de todos los meses los miércoles   
0 3 * * 3 /scripts/mish.sh
# ejecución del script mish.sh a las 3h y a las 6h 0m todos los días de todos los meses los miércoles,viernes y domingos  
0 3,6 * * 0,3,5 /scripts/mish.sh
# ejecución del script mish.sh cada 15 minutos los miércoles,viernes y domingos  
0
*/15 * * * 0,3,5 /scripts/mish.sh
# ejecución del script mish.sh a las 3h y 6h 0m cada 2 días
0
* 3,6 * * */2 /scripts/mish.sh

Del mismo modo se pueden indicar momentos concretos con la etiqueta @momento comando. Los momentos concretos que se pueden indicar son los siguientes:

  • @yearly, es lo mismo que indicar que la tarea se ejecutará de forma anual el 1 de enero a las 0:00 o lo que es lo mismo 0 0 1 1 *
  • @monthly,  es lo mismo que decir que la tarea se ejecutará mensualmente el primer día del mes a las 0:00 o lo que es lo mismo 0 0 1 * *.
  • @weekly, es lo mismo que decir que la tarea se ejecutará semanalmente el primer día de la semana a las 0:00 o lo que es lo mismo 0 0 * * 0.
  • @daily, es lo mismo que decir que la tarea se ejecutará diariamente todos los días a las 0:00 o lo que es lo mismo 0 0 * * *.
  • @hourly, es lo mismo que decir que la tarea se ejecutará cada hora  el primer minuto o lo que es lo mismo 0 * * * *.
  • @reboot, se ejecuta en el arranque. Hay que tener en cuenta que esta ejecución se realiza antes del login de usuario

Algún ejemplo sería

# ejecución anual del script mish.sh
@yearly scripts/mish.sh
# ejecución cada mes del script mish.sh 
@monthly scripts/mish.s
# ejecución cada semana del script mish.sh
@weekly scripts/mish.s
# ejecución cada día del script mish.sh
@daily scripts/mish.sh 
# ejecución cada hora del script mish.sh
@hourly scripts/mish.sh 
# ejecución al iniciar el sistema del script mish.sh
@reboot scripts/mish.sh

Ejecuciones especiales

En algunos casos no es suficiente con crear una tarea programada ya que no es necesaria una programación en tiempo específico, sino que se necesita la ejecución de una acción como desencadenante. El ejemplo más claro es la ejecución de un script cuando se inicia sesión o cuando se abre un terminal. Para ello existen una serie de carpetas que guardan los scripts que se ejecutarán en un momento determinado. Las carpetas son las siguientes:

  • /home/usuario/.profile: directorio oculto que guarda todos los scripts que se ejecutarán cuando el usuario inicie sesión. En el caso de querer ejecutar un script tan solo se debe guardar en esta carpeta con permisos de ejecución. Lo malo que tiene esta opción que que es por usuario
  • /home/usuario/.bash_logout: el mismo caso que el anterior pero cuando el usuario cierra sesión
  • /home/usuario/.bashrc: el mismo caso que el anterior pero cuando el usuario abre un terminal
  • /etc/profile.d: directorio que guarda los scripts que se ejecutan cuando se inicia sesión. En este caso estos scripts afectan a todo el mundo. Por lo general se suelen utilizar para sestear variables globales o para montar unidades de red
  • /etc/bash.bashrc: directorio que guarda los scripts que se ejecutan cuando se inicia un bash.
  • /etc/rcX.d/: los directorios encargados de los niveles de arranque guardan los scripts o punteros a /etc/init.d/ que se ejecutarán en el momento determinado. Hay que tener en cuenta que para que este método funcione se debe guardar la nomenclatura de los scripts (KXX o SXX). La forma más sencilla es colocar el archivo.sh en /etc/init.d/ y crear un enlace situándolo en la carpeta del nivel de arranque donde queramos que se ejecute (hay que tener en cuenta que tanto script como enlace deben tener permisos de ejecución y que el enlace no tiene extensión)
ln -s /etc/init.d/mish.sh /etc/rc6.d/K99mish