RasPi: automatización con Cron & CronTab

Hace ya algún tiempo, cuando os comentaba cómo enviar mensajes con el bot de Twitter, también os dije que lo que podíamos hacer era automatizar su activación, de manera que se pudiera enviar automáticamente cada cierto tiempo.

Cron, muy posiblemente procedente de la palabra griega chronos, es un demonio o proceso desatendido capaz de ejecutar acciones o comandos cada cierto tiempo. Es especialmente potente, ya que acepta casi cualquier tipo de programación: por segundos, minutos, horas, diario, semanal, intervalos, etc…

Yo solo os daré una pequeña pauta para poder lanzar, por ejemplo, el bot de Twitter de manera automática cada hora. Para profundizar mas en el tema, os recomiendo que consultéis la WikiPedia o la documentación específica de Unix, man cron o man crontab.

Bien, vamos al lío. Si recordáis de la anterior entrada, en la que explicábamos cómo lanzar el bot de Twitter, os decía que era posible “publicar el estado de nuestra Pi de manera autónoma y con una cadencia temporal definida”. Esto no es mas que ejecutar el script que creamos en su día cada cierto tiempo, cada hora, por ejemplo.

Cron mantiene una interfaz de configuración bastante intuitiva:

*/5 * * * * /home/user/test.sh

La siguiente tabla define los intervalos en los que se deben ejecutar los comandos deseados:

.---------------- minuto (0 - 59) 
|  .------------- hora (0 - 23)
|  |  .---------- día del mes (1 - 31)
|  |  |  .------- mes (1 - 12) O jan,feb,mar,apr ... (los meses en inglés)
|  |  |  |  .---- día de la semana (0 - 6) (Domingo=0 ó 7) O sun,mon,tue,wed,thu,fri,sat (los días en inglés) 
|  |  |  |  |
*  *  *  *  *  comando para ser ejecutado

Según la tabla anterior, para cada * corresponde un indicador de tiempo. En el ejemplo, hemos decidido que, para todos los minutos (*) con un intervalo de 5 (*/5), y para cada hora, día, etc… se debe ejecutar el comando

/home/user/test.sh

 

Esta sentencia se debe informar en un fichero de configuración de cron específico por usuario, siendo posible, pues, que ese usuario ejecute sus propios comandos, indistintamente de lo que puedan hacer otros en su mismo caso. Es decir, cron puede ser programado por cualquier usuario independientemente, por lo que un comando puede tener o no validez según quién lo ejecute (hay que tenerlo muy claro a la hora de programarlo!).

Y finalmente, para editar cron de una manera segura y eficiente, lo recomendable es hacerlo con el comando crontab. Crontab ejecutará un editor (por defecto nano) que abrirá (o creará) el fichero de configuración de cron para el usuario actual. Es muy recomendable hacerlo mediante este sistema, ya que tras guardar los cambios se realiza un test de la sintaxis de configuración de cron y, si esta no es correcta, se nos informará tras guardar dicho fichero.

Vamos a ver el caso práctico que nos ocupa.

Creamos un nuevo fichero python con el contenido que queremos que el bot muestre. Éste se llamará temp.py y se encuentra en la misma carpeta que el anterior:

#!/usr/bin/env python

import os
import sys
from twython import Twython

CONSUMER_KEY = 'XXXXXXXXXX'
CONSUMER_SECRET = 'XXXXXXXXXX'
ACCESS_KEY = 'XXXXXXXXXX'
ACCESS_SECRET = 'XXXXXXXXXX'

api = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)

cmd = 'sudo /opt/vc/bin/vcgencmd measure_temp'
line = os.popen(cmd).readline().strip()
temp = line.split('=')[1].split("'")[0]
statusString = 'I`m alive, and my current CPU temperature is: ' + temp + ' C'

api.update_status(status=statusString)

Guardamos el fichero y ahora podemos probarlo:

pi@raspberrypi ~/TwitterBot $ python temp.py
Test de temperatura

Test de temperatura enviado mediante el bot de Twitter

Como vemos, se ha publicado correctamente el twit. Ahora ya podemos editar nuestra tabla de cron, y programarlo para que se ejecute, por ejemplo, una vez cada hora:

pi@raspberrypi ~/TwitterBot $ crontab -e

*/60 * * * * python /home/pi/TwitterBot/temp.py

Una vez editado, lo guardamos y se iniciará automáticamente, ejecutando el comando que hemos indicado cada hora (*/60, indica para todos los minutos, cada 60 ejecutar…).

Ahora ya tenemos las primeras pautas para ejecutar comandos de manera automatizada. Recordad que es aplicable a cualquier comando que podáis ejecutar desde la shell, sin limitaciones.

Espero que os haya parecido interesante.

Jordi

Share Button

Related Images:

6 comentarios

    • Hola, muy buenas Marco, y gracias por tu comentario.

      ¿En qué estado se te queda? ¿Se lanza, o no se lanza el ejecutable? ¿Has marcado el fichero sh como ejecutable?

      Recuerda:

      $ chmod +x nombre_ejecutable.sh

      ¿Puedes ejecutar el .sh a mano sin cron? ¿Obtienes algún error?

      Si me das más detalles intentaré ayudarte 😉

      Un saludo!
      Jordi

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

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