Tenía en el tintero hacer una publicación de creación de scripts y como funciona cron y crontab, finalmente llego el día, así que aprenderemos como crear un pequeño script simple, y después entender que es cron y crontab, saber sus diferencias y generar una tarea programando su ejecución cada cierto tiempo.
Creando un script para liberar cache de memoria
Antes que nada, para los que se inician en el mundo Linux, los scripts se utilizan para automatizar o realizarlas sin la necesidad de tener que hacerlo manualmente, ya que en el propio archivo del script pondremos todos los comandos necesarios para realizar la tarea.
Para crear un script, vamos a hacer uso de un editor de texto, si siguen el blog verán que a mi me gusta usar nano, pero existen muchos otros como vi, vim, gedit, etc. Solo debemos considerar 2 cosas importantes al hacerlo:
- Guardar el archivo con un nombre, recomiendo que sea descriptivo del servicio, pero si o si, debe terminar con extensión .sh
- Para que el sistema sepa que es un script debemos colocar como primera linea #!/bin/bash al principio del mismo.
Por ejemplo vamos a hacer un script, que limpie la memoria cache de nuestro Linux, sin necesidad de reiniciar lo voy a llamar limpiar_cache.sh
nano limpiar_cache.sh
Ahora vamos a valernos de los comandos para liberar memoria, así que pegamos lo siguiente:
#!/bin/bash sync; echo 3 > /proc/sys/vm/drop_caches
Guardamos, si usamos nano F2, y solo falta darle permisos de ejecución, dado que si no el script nunca correrá.
chmod x limpiar_cache.sh
Listo el script, como verán es bastante simple de hacer y podemos lanzarlo para probar como funciona con sh script o ./script.sh
Cron y Crontab
Cron y Crontab son 2 elementos muy importantes a la hora de programar tareas y que se ejecuten sin que tengamos que estar pendientes de su estado, en Windows existe su equivalente llamado programador de tareas. Veamos las diferencias:
Cron es un administrador regular de procesos que corre en segundo plano (también llamado demonio) permite ejecutar procesos a intervalos regulares (por ejemplo, cada minuto, día, semana o mes). Los procesos que deben ejecutarse y la hora en la que deben hacerlo se especifican en el fichero crontab.
Crontab es un simple archivo de texto, donde se guardan una lista de comandos a ejecutar en un tiempo especificado por el usuario. Crontab verificará la fecha y hora en que se debe ejecutar un script o un comando, también mirara los permisos de ejecución y se realizará en background (segundo plano). Generalmente cada usuario del sistema posee su propio fichero Crontab. Se considera que el ubicado en la carpeta etc pertenece al usuario root. Para generar el archivo propio, cada usuario deberá hacer uso del comando crontab (dicho comando es igual para cada usuario).
Teniendo un script creado y habiendo entendido que cron es el servicio y crontab el archivo de configuración, vamos a programar una tarea que limpie la memoria.
Antes que nada vamos a ver como funciona crontab y sus parámetros, teniendo en cuenta que voy a hacer todo con permisos de root:
Para ver las tareas creadas usamos el parámetro -l
crontab -l
Para editarlos o crear una tarea con -e
crontab -e
Define el directoriod e crontab del usuario (este debe tener permisos de escritura y ejecucion del usuario) con -c carpeta
crontab -c dir
Administrar el crontab de otro usuario, ejemplos:
crontab -u usuario
crontab -l -u root crontab -e usuario2 crontab -d -u usuario
El -d es para eliminar las tareas previamente creadas.
Programando una tarea
Las tareas que crearemos, requieren una sintaxis determinada. Tienen 5 asteriscos al principio seguidos del comando a ejecutar. Veamos en detalle para qué sirve cada cosa.
* * * * * /home/nksistemas/limpiar_cache.sh
En este gráfico se explica que es cada asterisco
Los 5 asteriscos, se ponen asterisco espacio asteristo espacio… y mirando de izquierda a derecha representan:
- Minutos: de 0 a 59.
- Horas: de 0 a 23.
- Día del mes: de 1 a 31.
- Mes: de 1 a 12, siendo 1 Enero … 12 Diciembre.
- Día de la semana: de 0 a 7, siendo 0 el domingo.
Con los operadores es posible especificar varios valores en un campo; existen tres posibles valores:
- El asterisco (*): Este operador abarca todos los valores posibles; un asterisco en un campo minutos es igual a ejecutar el script cada minuto.
- la coma (,): Este operador permite especificar una lista de valores; por ejemplo si queremos ejecutar un comando los lunes y miércoles: «1,3» en el campo de los días.
- El guión (-): Este operador especifica una serie de valores de manera agrupada con un cota inferior y una superior; por ejemplo si quisiéramos ejecutar un comando de lunes a viernes podríamos colocar el siguiente valor en el campo día: «1-5», que es equivalente a 1,2,3,4,5.
Creando una tarea
Para crear la tarea lanzamos el comando
crontab -e
Para comenzar a ingresar datos, vamos a usar la tecla Insert, que es el modo escritura, una vez que agreguemos todo lo necesario para guardar presionamos la tecla “ESC” y ponemos :wq! para que se grabe.
Ejemplos
Ejemplo 1
El script limpiar_cache.sh ubicado en /home/nksistemas/ se ejecutará, cada minuto, de cada hora, de cada día del mes, de cada mes y cada día de la semana
* * * * * /home/nksistemas/limpiar_cache.sh
Ejemplo 2
El script limpiar_cache.sh ubicado en /home/nksistemas/ se ejecutará, cada 40 minutos, de cada hora, de cada día del mes, de cada mes y cada día de la semana
/40 * * * * /home/nksistemas/limpiar_cache.sh
Ejemplo 3
Si deseamos ejecutar el script todos los 1 de octubre a las 7:30 haríamos
30 7 1 10 * /home/nksistemas/limpiar_cache.sh
Ejemplo 4
Para que corra a las 3 AM todos los días
0 3 * * * * /home/nksistemas/limpiar_cache.sh
Ejemplo 5
Ejecutar la tarea a las 22 PM todos los días.
0 22 * * * * /home/nksistemas/limpiar_cache.sh
Ejemplo 6
Ejecutar un script de lunes a viernes a las 2:30 horas.
30 2 * * 1-5 /home/nksistemas/limpiar_cache.sh
Ejemplo 7
Ejecutar el script cada 5 minutos, durante 2 horas de lunes a viernes
/5 2 * * 1-5 /home/nksistemas/limpiar_cache.sh
PALABRAS RESERVADAS
Muchas veces tenemos palabras reservadas para facilitar el uso de programas o lenguajes de programación. Cron también los tiene:
- @reboot: se ejecuta una única vez al inicio.
- @yearly/@annually: ejecutar cada año.
- @monthly: ejecutar una vez al mes.
- @weekly: una vez a la semana.
- @daily/@midnight: una vez al día.
- @hourly: cada hora.
Por ejemplo, para ejecutar el script cada hora:
@hourly /home/nksistemas/limpiar_cache.sh
IMPORTANTE: Puede que sea necesario reiniciar el servicio Cron luego de agregar una tarea:
service crond restart o systemctl restart crond