Jhony9625
Posts: 14
Joined: Thu Apr 20, 2017 3:18 am

Como ejecutar un archivo de python al iniciar raspberry

Thu Apr 20, 2017 7:16 pm

Buenas, sucede que tengo un código en python el cual hace el envío de información a una base de datos, pero deseo que ese código se comience a ejecutar apenas se encienda la raspberry, he intentado varias cosas que he encontrado en internet como estos:

https://nideaderedes.urlansoft.com/2013 ... pberry-pi/
https://codigo22.com/learn/2016/01/26/a ... raspberry/

Realicé todos los pasos que dicen ambas páginas pero ninguno tuvo éxito, no me genera ningún error simplemente no inicia el código de python y la verdad no me explico por qué.

No sé qué mas hacer.

Saludos y muchas gracias.

User avatar
lmarmisa
Posts: 1222
Joined: Thu Feb 14, 2013 2:22 am
Location: Jávea, Spain

Re: Como ejecutar un archivo de python al iniciar raspberry

Thu Apr 20, 2017 9:00 pm

Supongo que tu script python deseas que corra como usuario pi.

Te recomiendo utilizar el programa crontab:

https://help.ubuntu.com/community/CronHowto

Supongamos que tu script se almacena en /home/pi/miscript.py.

Edita las tareas de cron con el siguiente comando (elige como editor nano la primera vez):

Code: Select all

crontab -e
Y añade al final una línea como ésta:

Code: Select all

@reboot /usr/bin/python /home/pi/miscript.py
Por si acaso, podrías programar un pequeño retardo (de 45 segundos en este ejemplo) para que entre el script no vaya a ser que todavía no haya red en el momento del arranque. Lo puedes hacer de este modo:

Code: Select all

@reboot sleep 45; /usr/bin/python /home/pi/miscript.py
Podrías redireccionar la salida del script a un fichero de este modo:

Code: Select all

@reboot sleep 45; /usr/bin/python /home/pi/miscript.py > /home/pi/miscript.log
Si en vez > escribes >> en la redirección, se irán añadiendo las salidas al fichero de log sin borrarlo con cada nueva llamada al script.

Finalmente, puedes ver las tareas programadas del cron con este comando:

Code: Select all

crontab -l

Jhony9625
Posts: 14
Joined: Thu Apr 20, 2017 3:18 am

Re: Como ejecutar un archivo de python al iniciar raspberry

Fri Apr 21, 2017 4:00 am

Hice todos los pasos que dices pero reinicio la raspberry y no inicia nada y también cuando ejecuto el comando crontab -l me sale lo siguiente:

Code: Select all

[email protected]:~ $ crontab -|
> 
Y se queda ahí como esperando una instrucción, no sé qué signifique.

Muchas gracias.

User avatar
lmarmisa
Posts: 1222
Joined: Thu Feb 14, 2013 2:22 am
Location: Jávea, Spain

Re: Como ejecutar un archivo de python al iniciar raspberry

Fri Apr 21, 2017 7:53 am

Has escrito mal el parámetro del comando crontab. Debes teclear una ele, no el carácter "pipe":

Code: Select all

crontab -l
Como has escrito un caráter "pipe", te sale un carácter ">" esperando un supuesto siguiente comando que sigue a crontab. Para salir de ahí, pulsa control-C.

El comando crontab -l debería dar una salida de este tipo:

Code: Select all

[email protected]:~ $ crontab -l
# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
@reboot sleep 45; /usr/bin/python /home/pi/miscript.py
[email protected]:~ $
Para saber si funciona el comando que has escrito en crontab, copia de la salida anterior con el ratón lo siguiente:

Code: Select all

sleep 45; /usr/bin/python /home/pi/miscript.py
y pégalo en el terminal para que se ejecute el comando y ver si funciona en modo manual. Ojo. En mi ejemplo hay que esperar 45 segundos para que empiece a ejcutarse el script. Así que un poco de paciencia.

Si el script python funciona en modo manual, deberá también funcionar lanzado por cron tras el arranque de la RPi.

Jhony9625
Posts: 14
Joined: Thu Apr 20, 2017 3:18 am

Re: Como ejecutar un archivo de python al iniciar raspberry

Fri Apr 21, 2017 7:16 pm

Muy bien he comprobado que funciona de forma manual sin embargo, al iniciar la raspberry no se ejecuta nada ni abre nada, entonces supongo que no se está ejecutando el programa, ¿cómo hago para saber si el programa se está ejecutando? ¿aún falta algo que deba hacer?

Muchas gracias.

User avatar
lmarmisa
Posts: 1222
Joined: Thu Feb 14, 2013 2:22 am
Location: Jávea, Spain

Re: Como ejecutar un archivo de python al iniciar raspberry

Fri Apr 21, 2017 7:44 pm

Hay una pequeña diferencia entre el cron y la shell interactiva del terminal en el que tecleas los comandos. La diferencia es que las variables de entorno del sistema (variable PATH, por ejemplo) no son iguales, al haber diferencias en la ejecución de los scripts de inicio /etc/profile, .profile y .bashrc. Eso da a veces problemas, aunque para programas normalitos no suele afectar.

Sería importante comprobar si el script realmente arranca o no. Podría ocurrir que el programa arranque pero que posteriormente falle la ejecución por algún motivo.

Para ello sería bueno conocer algún detalle de su comportamiento. Dices que envía datos a una base de datos. ¿Sabes si saca alguna información de salida también que ayude a ver lo que está haciendo?. La redirección de stdout y stderr podría ayudar a ver por qué el script no funciona exactamente igual arrancado por el cron en lugar de tecleado por comando.

Más preguntas: ¿La base de datos es externa a la RPi?. ¿Ese script python es una aplicación que use funciones de entorno gráfico (por ejemplo, ventanas)?.

Jhony9625
Posts: 14
Joined: Thu Apr 20, 2017 3:18 am

Re: Como ejecutar un archivo de python al iniciar raspberry

Sat Apr 22, 2017 2:21 pm

El código funciona muy bien lo he tenido corriendo hasta por 8 horas, no lo coloco acá porque la verdad es bastante extenso (tiene unas 300 líneas aproximadamente) pero si lo quieres ver lo puedo subir.

Hasta el momento el código no toma ningún dato de la base de datos simplemente hace el envío de información hacia una base de datos de mysql y el servidor es la raspi, también hace toma de datos de un microcontrolador con una cierta cantidad de sensores, en el código tengo varios print para la visualización de lo que vaya haciendo el código cíclicamente y poder darme información de su funcionamiento correcto, por eso te hacía la pregunta, ¿Cómo hago para saber que el código está funcionando en cuanto enciendo la raspi? El código no utiliza un entorno gráfico por el momento.

Muchas gracias

User avatar
lmarmisa
Posts: 1222
Joined: Thu Feb 14, 2013 2:22 am
Location: Jávea, Spain

Re: Como ejecutar un archivo de python al iniciar raspberry

Sat Apr 22, 2017 4:14 pm

Hola de nuevo, Jhony9625.

De acuerdo a lo que comentas veo dos posibles motivos que expliquen tus dificultades:

1) Tal vez haya algún problema sintáctico y el script no se está arrancando. Para comprobar que efectivamente se arranca ese scrpit, ya te comenté que podemos usar la redirección de stdout y stderr.

Intenta modificar la línea que añadiste al crontab de este modo:

Code: Select all

@reboot sleep 45; /usr/bin/python /home/pi/miscript.py > /home/pi/stdout.txt 2> /home/pi/stderr.txt
Reinicia el sistema y, si el script se lanza adecuadamente, verás que se han creado los ficheros /home/pi/stdout.txt y /home/pi/stderr.txt.

Si se han creado esos dos ficheros, el script se ha arrancado. Si no, hay que repasar la sintaxis de la línea. Además en el fichero stdout.txt irán apareciendo las diferentes líneas correspondientes a las sentencias print que se vayan ejecutando en el script. No obstante, las salidas de los print no se escriben inmediatamente al fichero sino cuando se llena un buffer interno. Si quieres forzar a que los carácteres del buffer se vuelquen al fichero de salida en un momento dado, puedes usar la sentencia flush en python:

Code: Select all

sys.stdout.flush()
sys.stderr,flush()
En el fichero stderr.txt irás viendo posibles mensajes de error o excepciones que se hayan producido al ejecutar el script.

Para echar un vistazo a los ficheros de redirección puedes usar el comando tail -f (termínalo con ctr-c):

Code: Select all

cd
tail -f stdout.txt
tail -f stderr.txt
También puedes ver que el script se está ejecutando con los siguientes comandos:

Code: Select all

ps -u pi -f
ps -u pi -f | grep python
Si eres tan amable, dime si se crean los dos ficheros stdout.txt y stderr.txt y si ves el proceso con el comando ps y así ya estamos seguros de que el script se lanza.

2) Me comentas que el script escribe datos en mysql y que esa base de datos está en la propia RPi. En el arranque los servicios y servidores pueden precisar un cierto tiempo para que estén operativos. Si tu programa intentara conectarse a la base de datos demasiado pronto y una sola vez y en ese momento todavía no estuviera operativa, pues habría un problema.

Los programas conviene diseñarlos para adaptarse a situaciones imprevistas. Por ejemplo, si ahora no puedo conectarme a la bbdd, pues lo intento después. O, si hay una desconexión con un server en un momento dado, pues intento reconectarme y reanudar mis accesos cuando dicho servidor vuelva a estar operativo. Ese tipo de medidas hacen que un programa sea o no robusto. Supongo que tu diseño tendrá en cuenta que el servidor mysql pueda no estar disponible en un momento dado.

Jhony9625
Posts: 14
Joined: Thu Apr 20, 2017 3:18 am

Re: Como ejecutar un archivo de python al iniciar raspberry

Tue Apr 25, 2017 6:31 pm

Ya vi que si se está ejecutando el archivo con la instrucción que me diste de colocar que se cree un archivo de texto.

Muchas gracias por la ayuda y disculpa la demora en contestar.

Saludos

osvaldo1911
Posts: 1
Joined: Fri May 12, 2017 5:08 am

Re: Como ejecutar un archivo de python al iniciar raspberry

Fri May 12, 2017 5:20 am

Hola quiero que se ejecute el script que inicia un comando, solo necesito hacer lo de -e e ingresar cada cuanto tiempo y poner la ruta del script y con eso cada vez que encienda las raspi lo hará :| ?

Crozz Bite
Posts: 14
Joined: Thu Jan 24, 2019 5:23 pm

Re: Como ejecutar un archivo de python al iniciar raspberry

Thu May 02, 2019 9:47 pm

lmarmisa wrote:
Thu Apr 20, 2017 9:00 pm
Supongo que tu script python deseas que corra como usuario pi.

Te recomiendo utilizar el programa crontab:

https://help.ubuntu.com/community/CronHowto

Supongamos que tu script se almacena en /home/pi/miscript.py.

Edita las tareas de cron con el siguiente comando (elige como editor nano la primera vez):

Code: Select all

crontab -e
Y añade al final una línea como ésta:

Code: Select all

@reboot /usr/bin/python /home/pi/miscript.py
Por si acaso, podrías programar un pequeño retardo (de 45 segundos en este ejemplo) para que entre el script no vaya a ser que todavía no haya red en el momento del arranque. Lo puedes hacer de este modo:

Code: Select all

@reboot sleep 45; /usr/bin/python /home/pi/miscript.py
Podrías redireccionar la salida del script a un fichero de este modo:

Code: Select all

@reboot sleep 45; /usr/bin/python /home/pi/miscript.py > /home/pi/miscript.log
Si en vez > escribes >> en la redirección, se irán añadiendo las salidas al fichero de log sin borrarlo con cada nueva llamada al script.

Finalmente, puedes ver las tareas programadas del cron con este comando:

Code: Select all

crontab -l
hola, hice lo que dijiste aca y al moemnto de poner la linea para probar el programa pero al momento de querer ejecutarlo me manda como si tuviera errores en las lineas desde los comandos Import hasta definiciones de variables , no se que es lo que hice mal pareciera como si no detectara que fuera un script de python puedo subir el codigo si lo necesitas.
como puedo arreglar eso ?

Return to “Español”