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
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
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
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
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.
Tal y como se puede ver en la imagen, a continuación os explico los campos de la sintaxis.
- 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
- La hora en la que queremos que se ejecute, le podemos poner exactamente lo mismo que a los minutos.
- El día del mes que queremos que se ejecute
- El mes en el que queremos que se ejecute
- 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.
- 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
Hay que mencionar que hay que habilitar los demonios con systemctl start NOMBREDELDEMONIO
ej: systemctl start atd
muchas gracias por el comentario, lo había pasado por alto en la implementación
[…] Programar tarea en Linux desde consola / terminal de comandos […]