Ejecutar un script de Python al inicio

29

Esta pregunta se ha hecho varias veces antes, pero no parecía que funcionara con la información existente.

Mi Pi ejecuta Raspbian. Tengo un script de Python llamado dnscheck.py que se repite para siempre.

Lo necesito para correr en el arranque. Sé que tengo que crear un archivo .sh que contenga algo como

sudo python dnscheck.py &

Lo que no sé es dónde debería estar este archivo o si debería contener algo más. Sé acerca de la carpeta init.d, pero al ver el ejemplo esqueleto, imagino que debería haber una manera más simple de hacer esta tarea simple.

Vlad Schnakovszki
fuente
para una forma realmente fácil, revisa este tutorial paso a paso -> youtu.be/Tvnrx-2QaUU crea tantos lanzadores como necesites y dirígelos a todos en crontab
Hossein RM

Respuestas:

20

Si desea controlar el proceso con comandos como iniciar, detener, reiniciar, etc., usar el script de esqueleto y modificarlo para sus propósitos podría ser la mejor opción.

Si solo desea que se inicie el proceso, ingrese el comando /etc/rc.local. (No tengo mi RPi a mano, pero leí en línea que hay una línea de 'salida 0' allí, deberías poner tu comando sobre esta línea)

ikku
fuente
1
¡Funcionó! Debo agregar que configurar los permisos para el script y rc.local de nuevo a 755 (lectura / escritura / ejecución) es imprescindible. No estoy seguro si ambos necesitan esta configuración, pero funcionó para mí. ¡Muchas gracias por la ayuda!
Vlad Schnakovszki
77
"como lo escribió en su pregunta" No del todo, no necesita sudo como rc.localejecuta root. También debe especificar la ruta completa al script, obviamente. También debe agregar& al final para que el script se bifurque, por ejemplo /path/to/foobar.py &.
Ricitos de oro
1
@goldilocks, ¿podría explicar por qué necesito agregar &? Porque cuando lo uso sin él, todo sigue funcionando como se esperaba.
Huy.PhamNhu
2
@ Huy.PhamNhu Respondiendo a su pregunta: Pi ejecutará este programa en el arranque y antes de que se inicien otros servicios. Si no incluye el ampersand y si su programa se ejecuta continuamente, el Pi no completará su proceso de arranque. El ampersand permite que el comando se ejecute en un proceso separado y continúe arrancando con el proceso principal en ejecución.
Amine Harbaoui
6

Mueva su script (lo guardaremos en el archivo dnscheck) /etc/init.d/y establezca los permisos para que se pueda ejecutar:

chmod 755 /etc/init.d/dnscheck

Agregue etiquetas de inicio LSB a la parte superior de su script. Probablemente desee cambiar Required-Start / Stop y las etiquetas de descripción para que se ajusten a su script.

### BEGIN INIT INFO
# Provides:          dnscheck
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

Luego cree los enlaces simbólicos ejecutando

update-rc.d /etc/init.d/dnscheck defaults
Bert
fuente
2
Tenga en cuenta que si bien esta fue una respuesta decente hace 3 años y medio, y seguirá funcionando porque el nuevo sistema de inicio de Raspbian es compatible con versiones anteriores de los scripts de estilo LSB / SysV, los nuevos usuarios estarían mejor aprendiendo a usar el nuevo sistema ( systemd ) si solo agregar una línea /etc/rc.locales insuficiente.
Ricitos de oro
3

Hay muchas maneras de hacer esto, por supuesto, pero no olvides usarlo cron. Si coloca una @rebootlínea en su crontab, ese comando se ejecutará en cada reinicio.

Para probar, acabo de agregar la siguiente línea a mi crontab de usuario con crontab -e: @reboot echo "$(date)" >> ~/boot.txt La ventaja de este método es que puede llamar al trabajo según sea necesario en otros intervalos además del tiempo de arranque, y no tiene que editar scripts de inicio.

bobstro
fuente
3

si usa el archivo rc.local, esto puede ser útil para solucionar problemas. Puede agregar líneas de registro para registrar errores (stderr) y la salida del comando (stdout) en el archivo de registro. Según este ejemplo, ese archivo se guarda en /tmp/rc.local.log

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

exec 2> /tmp/rc.local.log      # send stderr from rc.local to a log file
exec 1>&2                      # send stdout to the same log file

# Your other commands...

exit 0

Leer mas

Tharanga
fuente
3

Estoy realmente sorprendido de djb daemontools no se menciona aquí. Daemontools supervisa adecuadamente el proceso y puede agregar funciones interesantes como el registro rotado automáticamente. TL; DR si no está familiarizado con nada de esto, su proceso se reiniciará cada vez que falle y se iniciará automáticamente cuando su Pi se encienda. Esto es genial si escribiste un programa de Python malo que tiene modos de falla pero no quieres que simplemente muera si se encuentra un error.

Instalar:

sudo apt-get install daemontools daemontools-run

Luego siga los pasos para crear procesos demonizados:

En su mayoría es tan simple como copiar un runscript en /etc/service/<my_custom_service_name>Otra ventaja: ¡puede ejecutarlo como cualquier usuario o root! Detalles en el enlace.

FWIW Tenía un proyecto Pi donde tenía 3 procesos diferentes de python (cada uno tenía un ciclo de ejecución usando el tiempo de CPU, por lo que al usar 3 procesos permití que cada proceso aprovechara 1 núcleo de CPU). Daemontools me permitió asegurarme de que los 3 se ejecutarían automáticamente y seguirían funcionando después de enchufar el Pi.

Sam
fuente
solución simple y fácil, su respuesta ahorró mucho tiempo, gracias ..
ShivaGuntuku
2

Aquí está la solución que uso constantemente.

Crea un archivo de escritorio

xyz.desktop

escriba lo siguiente en él

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=<Application Name Goes here>
Comment=
Exec=  python /home/pi/Desktop/execute_on_boot.py
StartupNotify=false
Terminal=true
Hidden=false

pegue este archivo en el

/home/pi/.config/autostart/

y reinicie su raspberry pi y debería ejecutar automáticamente su programa en una nueva terminal

evolucionista
fuente
por favor no corte y pegue las respuestas a múltiples preguntas. Si la respuesta es la misma, la versión más nueva debe marcarse como duplicada.
Steve Robillard
La única razón por la que no lo hice fue porque esta página tenía una mayor cantidad de visitas en comparación con la otra.
Evolucionador
@SteveRobillard Tampoco creo que tenga el representante requerido para hacerlo
evolucionista
Marcar una publicación solo toma 15 rep. Decidir qué hacer al respecto es el trabajo de los moderadores, por lo que el número de vistas es irrelevante. El sistema marca automáticamente las respuestas duplicadas. Son una forma de juego del sistema. Por lo tanto, eliminé el tercero.
Steve Robillard
@SteveRobillard Gracias por la información y perdona mi ignorancia. He marcado la pregunta anterior como duplicada.
evolucionista
2

Para usar un archivo .py, simplemente ponga la línea #!/usr/bin/pythonal comienzo de su archivo. Luego hazlo ejecutable con chmod +x filename. A continuación, añadir la línea /path/to/file.py &de /etc/rc.localantes de la exit 0línea (el intercambio /path/to/file.pycon la ruta a la secuencia de comandos). Esto hará que su script de Python se ejecute al final del arranque.

Teórico
fuente
0

Aquí hay un método aún más fácil que funcionó para mí. Modifique el inicio automático en LXDE.

Abra una terminal y edite el archivo de inicio automático de la siguiente manera:

sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart

agregue la siguiente línea de texto en la parte inferior (modifique la ruta según sea necesario a donde se encuentra su example.py)

@/usr/bin/python /home/pi/example.py

ctr-x, y guardar. Es posible que deba hacer que el script de Python sea ejecutable de la siguiente manera:

sudo chmod +x /home/pi/example.py

referencia para el inicio automático en LXDE y referencia para hacer que Python sea ejecutable

hidronica
fuente
Tenga en cuenta que esto no funcionará si no se inicia en una interfaz gráfica de usuario (es decir, ejecute su pi sin cabeza)
Havnar
0

Estas soluciones no funcionaron para mí al intentar iniciar un script de Python ejecutando Feh. Lo siguiente funcionó. Comienza una secuencia de comandos después de iniciar sesión.

Abra una sesión de terminal y edite el archivo

sudo nano /etc/profile

Agregue la siguiente línea al final del archivo

/home/pi/your_script_name.sh

reemplace el nombre y la ruta del script con el nombre y la ruta correctos del script de inicio. Guardar y Salir

Presione Ctrl + X para salir del editor nano seguido de Y para guardar el archivo.

Así es como se veía mi script.sh:

#!/bin/sh
cd /
cd home/pi/
sudo python your_python_sript.py &
exit 0
cd /

Creo que hice tanto el script.sh como el script.py ejecutable usando el chmod

sudo chmod +x home/pi/your_script_name.sh
sudo chmod +x home/pi/your_python_script.py
hidronica
fuente