Programar tarea en Linux desde consola / terminal de comandos

[notice]Desde que este post fue creado han pasado 8 años así que puede que hayan cambiado cosas.[/notice]

En el post de hoy voy a enseñar como programar tareas en un sistema Linux desde la consola (terminal) puesto que si tenemos un servidor al que accedemos por SSH quizá no tengamos una interfaz gráfica o gestor gráfico de tareas programadas.

¿Y para que nos sirve programar una tarea? Pues precisamente para eso, para realizar una tarea automáticamente sin tener que lanzarlo nosotros, ya sea porque es un script que hay que ejecutar cada minuto o bien porque es un script que se ha de ejecutar a una hora exacta.

at

Para programar tareas en linux tenemos varias formas, una de ellas es el comando AT, que nos permite definir una tarea programada que se ejecutará una única vez, y después de ser ejecutada, la tarea se borrará.

Supongamos que queremos programar para hoy a las 6:39 de la mañana una tarea a realizar. Escribiremos lo siguiente en la terminal.

at 6:39 AM Thu

Veremos que nos sale un mensaje indicando que los comandos se ejecutarán usando /bin/sh

comandoAT

En este caso hemos puesto que a las 6:39 haga un reinicio del servidor apache, pero podemos poner el comando que queramos / o comandos (en la siguiente linea). Cuando queramos guardar la programación definida, pulsaremos CONTROL + D y veremos que aparecen <EOT> y un mensaje indicándonos para cuando se ha programado la tarea para el próximo jueves.

 

Si queremos ver las entradas que hay programadas por AT, podemos usar el comando

at -l

at-l

Y podemos ver que es la entrada numero 2. De forma que si queremos borrarla, usaremos el comando

atrm 2

El cual borrará la entrada programada numero dos. Podemos confirmar que ha sido borrada volviendo a usar el comando at -l

atrm

 

cron (también llamado fcron)

Si queremos programar una tarea que será repetitiva, como podría ser una exportacion de la base de datos, copia de seguridad de ficheros del servidor, o cualquier otra tarea que queramos realizar repetitivamente sin tener que reprogramarla cada vez como con el comando anterior at, entonces usaremos cron.

Para añadir o editar alguna tarea programada, ejecutaremos el comando

crontab -e

crontab_edit

Ahora estaremos dentro de un fichero de texto, en el que podemos escribir, pero para que cron nos haga caso, obviamente debemos respetar una sintaxis.

cronfile_sintax

Tal y como se puede ver en la imagen, a continuación os explico los campos de la sintaxis.

  1. El minuto en el cual queremos que se ejecute, si queremos que sea cada minuto, podemos poner el *. Si queremos que sea en el minuto 5 le pondremos 5. Si queremos que sea cada 5 minutos entonces le pondremos */5
  2. La hora en la que queremos que se ejecute, le podemos poner exactamente lo mismo que a los minutos.
  3. El día del mes que queremos que se ejecute
  4. El mes en el que queremos que se ejecute
  5. El día de la semana en el que queremos que se ejecute, aquí viene a ser por ejemplo si queremos programar que los domingos (independientemente del numero del día que sea) se ejecute el script.
  6. Comando a ejecutar

Si pusiéramos * a todos los campos (salvo al del comando a ejecutar) tendríamos una tarea programada que se ejecutaría cada minuto. Esto puede venirnos bien si queremos hacer que WordPress pueda publicar entradas automáticamente, ya que realmente wordpress no tiene tareas programadas como tal, si no que necesita que un agente externo realice una petición a un php wp-cron.php que se encargará de revisar si para ese minuto,hora,día,mes,año hay alguna entrada programada. Si es así entonces la publicará.

O bien por ejemplo queremos enviar los datos generados por un programa a una web de información, o a un programa de un cliente.

Suponiendo que tenemos un script llamado backupDatabases.sh que queremos programarlo cada día a las 00:00 de la noche, para realizar las copias de seguridad de la base de datos.

0 00 * * * /bin/bash /home/usuario/backupDatabases.sh

Tenemos otro script llamado backupWebsites.sh que queremos que se ejecute cada 15 días a las 5:30 de la mañana, le pondremos.

30 05 */15 * * /bin/bash /home/usuario/backupDatabases.sh

Podríamos pensar en hacerlo de la siguiente forma, indicando exactamente los días que queremos que se ejecute (separados por comas), pero esto no nos asegura exactamente 15 días.

30 05 1,15,28 * * /bin/bash /home/usuario/backupDatabases.sh

 

Para facilitarnos aún más la tarea, cron trae algunos alias, que son unas configuraciones de tiempo predefinidas.

  • @reboot: Al iniciarse la máquina.
  • @yearly / @annually: Se ejecuta 1 vez al año (lo mismo que poner 0 0 1 1 *)
  • @monthly: Se ejecuta 1 vez al mes (lo mismo que poner 0 0 1 * *)
  • @weekly: Se ejecuta 1 vez a la semana
  • @daily / @midnight: Se ejecuta 1 vez al día, justo a las 00
  • @hourly: Se ejecuta el primer minuto de cada hora.

 

Cuando vayamos a usarlos, entonces la sintaxis queda mucho mas simple

@midnight /bin/bash /home/usuario/backupDatabases.sh

Por último para administrar los archivos de cron, podemos usar los siguientes comandos:

  • crontab -e: Edita el fichero de cron del usuario, si no se indica usuario con -u usuario , se entiende que es el del usuario con el cual estamos conectados.
  • contrab -l: Lista las tareas programadas de cron, si le pasamos tambien -u usuario, entonces mostrará las del usuario.
  • crontab -d: Elimina el fichero de tareas programadas, si indicamos -u usuario entonces borraremos las tareas programadas del usuario.
  • crontab file: Reemplazará los datos del cron actual con el del fichero que le indicamos. Perfecto para cuando queremos cargar en un nuevo servidor las tareas programadas que ya las tenemos en otros servidores.

 

 

 

2 comentarios

1 ping

  1. Hay que mencionar que hay que habilitar los demonios con systemctl start NOMBREDELDEMONIO

    ej: systemctl start atd

    1. muchas gracias por el comentario, lo había pasado por alto en la implementación

  1. […] Programar tarea en Linux desde consola / terminal de comandos […]

Responder a Takezo Yubel Cancelar la respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.