Ejecutar script al inicio


188

Estoy tratando de ejecutar un script cuando mi Raspberry Pi se inicia. Me gustaría que el navegador web se abra automáticamente.

He tratado de encontrar una solución simple (como colocar mi script en un directorio de "inicio" o algo similar) pero no veo nada de eso.

He investigado Upstart , pero estoy luchando por comprender cómo funciona. Las secuencias de comandos que he probado no han funcionado cuando las pruebo.


44
¿Qué sistema operativo estás ejecutando? En FreeBSD, que estoy usando en mi Pi, puede agregar scripts de inicio a /usr/local/etc/rc.d/, o simplemente agregar cosas a /etc/rc.local. Las diferentes distribuciones de Linux tienen diferentes métodos recomendados. Si está ejecutando X en él, entonces debe ser que mire en la adición de las cosas a su .xinitrco .xsessionarchivo.
ghoti

Puede encontrar más información sobre el proceso de inicio de X aquí .
ghoti

66
Tenga en cuenta que la respuesta aceptada aquí tiene algunas advertencias y técnicamente no inicia nada en el arranque, excepto en condiciones específicas. Léalo detenidamente.
Ricitos de oro

Está solicitando un script que se ejecuta cuando inicia sesión, no cuando se inicia el pi o al inicio. Dos cosas muy diferentes, y el título está sesgando los resultados de búsqueda de Google.
IAmNaN

Respuestas:


196

Para ejecutar Midori en el inicio, eche un vistazo a este tutorial . Para soluciones de bricolaje, sigue leyendo.


Puede agregar su comando ejecutable de secuencia de comandos en la parte inferior .bashrcque ejecutará su secuencia de comandos cada vez que abra un terminal (o ejecute una nueva instancia de bash) .

  1. Asegúrate de estar en la picarpeta:

    $ cd ~
    
  2. Cree un archivo y escriba una secuencia de comandos para ejecutar en el archivo:

    $ sudo nano superscript
    
  3. Guardar y salir: Ctrl+ X, Y,Enter

  4. Abrir .bashrcpara la configuración:

.bashrcNO está destinado a ejecutar scripts.

Se ejecuta cada vez que se inicia un shell interactivo sin inicio de sesión y se utiliza para configurar el shell.
~/.bashrc: executed by bash(1) for non-login shells.

   $ sudo nano .bashrc
  1. Desplácese hacia abajo y agregue la línea: ./superscript

  2. Guardar y salir: Ctrl+ X, Y,Enter


Si está buscando una solución que funcione en el arranque de la consola , eche un vistazo a este enlace . Resumen básico:

  1. Cree un archivo para su script de inicio y escriba su script en el archivo:

    $ sudo nano /etc/init.d/superscript
    
  2. Guardar y salir: Ctrl+ X, Y,Enter

  3. Haga que el script sea ejecutable:

    $ sudo chmod 755 /etc/init.d/superscript
    
  4. Registrar el script que se ejecutará al inicio:

    $ sudo update-rc.d superscript defaults
    

Si desea que se ejecute un script al iniciar en el entorno LXDE , puede echar un vistazo a esta publicación del foro de Raspberry Pi :

  1. Navegar a ~/.config/lxsession/LXDE-pi

  2. Abra el autostartarchivo en esa carpeta:

    $ sudo nano autostart
    
  3. Agregar @midorien una nueva línea. Si desea ejecutar algo como un script de Python, coloque algo como @python mypython.pyen una nueva línea. Ejecutar un archivo de script sería @./superscript, pero por alguna razón el script se ejecuta en un bucle infinito (quizás esto lo detendrá).

  4. Guardar y salir: Ctrl+ X, Y,Enter

  5. Reinicie su Raspberry Pi en el entorno LXDE.


El tutorial sobre cómo configurar Midori en el inicio era justo lo que estaba buscando. No estoy seguro de por qué hay tantas maneras de hacer algo tan simple, pero me alegra que esté funcionando ahora.
Tyler Murry

1
@ syb0rg La ejecución en la parte de inicio de sesión funciona de maravilla (+1) si inicio sesión a través de ssh, pero no cuando comienza la sesión de escritorio lxde. Hay una manera de hacerlo ?
George Profenza

@GeorgeProfenza ¿Cuándo lo haces $ sudo startx?
syb0rg

2
Solo quería señalar que el script pyhton se ejecutará, pero si hay algún error, solo estará en algún lugar en segundo plano utilizando el método / etc / xdg / lxsession / LXDE / autostart. el uso de .barshrc también revelará errores, pero es realmente importante asegurarse de que el guión sea ajustado en primer lugar (lo descubrí por las malas :))
George Profenza

77
.bashrcno se lee cuando el sistema arranca o cuando un usuario inicia sesión , solo cuando abre un nuevo terminal (y se lee cada vez que el usuario abre un nuevo terminal). Estoy desconcertado de que esta respuesta haya recibido tantos votos positivos: la primera parte es simplemente errónea . La tercera parte es correcta para ejecutar un programa GUI.
Gilles

46

La forma en que he visto a la mayoría de las personas hacerlo (eche un vistazo a los foros de Raspberry Pi), y lo he hecho con éxito es usar /etc/rc.local.

Todo lo que necesita hacer aquí es ponerlo ./myscripten el archivo de texto rc.local. Si está en python, pon python myscript.py.

Esto literalmente es "una solución simple, (como colocar mi script en un directorio" de inicio "o algo similar)" tal vez busque en los foros cuando tenga preguntas también, esta solución apareció en los primeros 4 resultados de un ¡búsqueda de Google!


44
Para su información, el rc.local por defecto tiene varios comentarios sobre el script que no hace nada y necesita cambiar los bits ejecutables. Esto no es cierto solo ingrese el comando para su script antes de la salida 0 y se ejecutará al inicio. Asegúrese de que su script salga de las ejecuciones en segundo plano o bloqueará la solicitud de inicio de sesión. Sí, eso fue lo que hice.
robar el


@rob ¿Quiere decir que sugieren que el script se configure como ejecutable? Esto se mitiga en la pregunta ejecutando el script mediante el comando python myscript.py. Si desea chmod + x y agregar #! /bin/python, puede ejecutar el script haciendo $pathtofile/myscript.pydonde $pathtofileestá .si está en el mismo directorio o en la ruta absoluta o relativa al archivo.
JFA

1
Eso no es bueno para un programa GUI como un navegador. /etc/rc.locales solo para iniciar los servicios del sistema (programas que no tienen una interfaz de usuario).
Gilles

1
@ ErickM.Sprengel Use una de las respuestas correctas en este hilo, como esta .
Gilles

32

Agréguelo al crontab

El crontab ejecuta comandos en momentos definidos.


Edite el archivo:

sudo crontab -e

Agregue una línea al archivo (aquí un script de Python):

@reboot python3 /home/pi/Desktop/exemple.py &

2
Para ser un poco quisquilloso aquí, técnicamente no es crontab que ejecuta el comando, sino de todos modos. Con respecto a la línea listada para agregar, es recomendable poner rutas completas para los comandos definidos aquí (en este caso, la ruta completa a python3), vea aquí
Ghanima

Este es el método que siempre he usado debido a su simplicidad. +1
Patrick Cook,

Eso no es bueno para un programa GUI como un navegador. /etc/rc.locales solo para iniciar programas que no tienen una interfaz de usuario.
Gilles

2
Después de pasar mucho tiempo tratando de hacerlo funcionar con rc.local e init.d y todo tipo de otras cosas ... ¡esto funcionó de inmediato! ¡Gracias!
Piotr Kula

44
esto no funciona por alguna razón en rpi os
Denis

11

Inicio automático de aplicaciones xorg

Si la secuencia de comandos que desea iniciar requiere una sesión xorg, entonces puede intentar seguir la especificación de inicio automático de freedesktop que podría o no funcionar según el entorno de escritorio que esté utilizando.

Alternativamente, puede orientar su entorno de escritorio específico como se describe en https://wiki.archlinux.org/index.php/autostarting .

Ejecutar un script como un servicio systemd

Si su script se ajusta a la descripción de un demonio o un 'servicio', y su sistema está ejecutando systemd, como es el caso de las linces raspbian y más modernas, entonces puede configurar su script para que se ejecute como un servicio systemd: esto proporciona un control granular sobre el ciclo de vida y el entorno de ejecución, así como las condiciones previas para (re) iniciar el script, como la red en funcionamiento. También es posible configurar el reinicio del servicio en caso de falla ( Restart=alwaysy retraso entre reiniciar, por ejemplo RestartSec=10).

Para uso en todo el sistema, cree su archivo de unidad systemd en /etc/systemd/system, por ejemplo, con vim /etc/systemd/system/autossh.service:

[Unit]
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target

[Service]
## use 'Type=forking' if the service backgrounds itself
## other values are Type=simple (default) and Type=oneshot
Type=forking
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=/usr/bin/killall -9 autossh
### NOTE: you can have multiple `ExecStop` lines
ExecStop=/usr/bin/killall ssh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody

# Useful during debugging; remove it once the service is working
StandardOutput=console

[Install]
WantedBy=multi-user.target

Ver también:

Ahora estamos listos para probar el servicio:

systemctl start autossh

Comprobación del estado del servicio:

systemctl status autossh

Detener el servicio:

systemctl stop autossh

Una vez que haya verificado que el servicio funciona como se esperaba, habilítelo con:

systemctl enable autossh

NOTA: Por razones de seguridad systemd, ejecutará el script en un entorno restringido, similar a cómo crontabse ejecutan los scripts, por lo tanto, no haga suposiciones sobre las variables del sistema preexistentes. Use las Environmentteclas si su script necesita variables específicas para ser definidas. Agregar set -xen la parte superior de su script bash y luego ejecutarlo systemctl status my_servicepodría ayudar a identificar por qué su script falla. Como regla general de tumb, siempre use rutas absolutas para todo, incluyendo echoy cat, o defina explícitamente su $ PATH.


7

Quiero agregar mis dos centavos, a pesar de que esta es una pregunta antigua, pero comúnmente se me pide que haga algo simple: el inicio automático. Intenté todas las soluciones sugeridas en todas las respuestas a esta pregunta. Ninguno de ellos trabajó para mí. Estoy usando Raspberry PI Model 2 con Raspbian.

La única forma en que podría hacer que mi aplicación se inicie automáticamente con éxito es a través de un script de la siguiente manera. Digo con éxito porque mi aplicación comenzó como se esperaba sin tener ningún problema, como comenzar con una ruta de trabajo incorrecta.

1.Cree un archivo vacío con la extensión .sh y asígnele el nombre que desee.

2. Copie y pegue lo siguiente EXACTAMENTE excepto que cambie "el nombre de su aplicación" por el nombre del script que acaba de crear.

 #! /bin/sh

 ### BEGIN INIT INFO
 # Provides:          noip
 # Required-Start:    $remote_fs $syslog
 # Required-Stop:     $remote_fs $syslog
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # Short-Description: Simple script to start a program at boot
 ### END INIT INFO

 #change /direct/path/to/your/application to the path your application is in.
 cd /direct/path/to/your/application      # example cd /home/pi/myprogram/

 #change YourProgramExactName to Exact name of your program that you want to auto start
 ./YourProgramExactName

 exit 0 
  1. Luego, guarde el archivo de script dentro de la carpeta de su aplicación

  2. Luego, abra la /home/pi/.config/autostartcarpeta. Puede ser diferente en tu caso. Simplemente abra su carpeta de inicio y habilite ver carpetas ocultas. abierta .config/autostart. Si no ve la carpeta de inicio automático, cree una carpeta llamada inicio automático dentro de la carpeta .config.

  3. dentro de la carpeta de inicio automático, deberá crear un acceso directo a su archivo de script que creó de la siguiente manera. Crea un archivo vacío con extensión .desktop.

  4. Copiar y pegar el siguiente en el archivo de escritorio vacío, excepto que tendrá que cambiar Comment, Name, Exec, Pathy Iconel valor del campo.

    [Desktop Entry]
    Comment=
    Exec=/path/to/Your/application/Name-of-the-script-file (.sh)
    Icon=/Path/to/Your/application/Icon/IconName
    Name=YourApplicationEXACTNAME
    Path=/Path/to/Your/Application-ONLY
    Type=Application
    
  5. Guarde y cierre el archivo después de cambiar todos los campos necesarios. Estás listo. Solo pruébalo.


Técnicamente, este script es ejecutado por el sistema en lugar de por un usuario específico, ¿entonces quizás su aplicación pertenece mejor a /usr/local/bin/ApplicationName...?
SlySven

@SlySven "el sistema" es un usuario específico.
Expiación limitada el

¿Se ejecuta como root (UID = 0) o como usuario pi (UID ~ 500 o 1000 IIRC)? Si se ejecuta como root u otro UID del sistema (menos de 500), es tradicionalmente una buena práctica almacenar el archivo de script ( o cualquiera de los que dependa) en el dispositivo raíz, de modo que si hubiera un problema con cualquier otro dispositivo (por ejemplo, homesi es un dispositivo separado) no habrá un problema con el archivo de script (o un archivo ejecutable) que no esté disponible cuando el ¡El sistema vuelve a fallar en un único /bin/shshell de usuario ! Hoy en día, la systemdforma es montar ambos /y /usrantes de que se inicie PID 1 ...
SlySven

5

También tuve problemas con esto. En el Raspberry Pi3 con Raspbian, esto es lo que hice:

  1. Cree un script de shell de inicio en su directorio raíz (llamé al mío "lanzamiento"):

sudo leafpad launch.sh

  1. Guarda el archivo
  2. Edite el archivo de inicio automático LXDE-pi

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

  1. Agregue esto al final de ese archivo

./launch.sh

  1. reiniciar

3

En el Raspberry Pi3 con Raspbian Stretch, esto es lo que hice:

Edite el archivo de inicio automático LXDE-pi

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

Agregue esto al final de ese archivo

    @sudo python3 /path/to/your/script.py

guardar y reiniciar


1

Método 1:

Para iniciar un comando automáticamente al iniciar sesión, coloque el comando en un archivo llamado

.bashrc

en el directorio de usuarios (por ejemplo / home / pi)

.bashrcNO está destinado a ejecutar scripts.

Se ejecuta cada vez que se inicia un shell interactivo sin inicio de sesión y se utiliza para configurar el shell.
~/.bashrc: executed by bash(1) for non-login shells.

Por ejemplo, el archivo podría contener

chromium-browser --kiosk www.google.com

lanzar Chromium en pantalla completa apuntando a www.google.com


Método 2:

Esta solución funciona muy bien. Una vez que se carga el navegador, hay un pequeño cuadrado negro en la parte superior izquierda de la pantalla que parece ser un error general (otros usuarios lo mencionan en los foros), pero de lo contrario, el modo de pantalla completa oculta todo excepto la página del navegador.

Edite el archivo de inicio automático:

sudo nano /etc/xdg/lxsession/LXDE/autostart 

Comente todo usando un '#' al comienzo de cada línea y luego agregue las siguientes líneas

Auto ejecutar el navegador

@xset s off
@xset -dpms
@xset s noblank
@midori -e Fullscreen -a http://google.com

Si es necesario, use la herramienta de configuración para habilitar la ejecución automática de la GUI al encender

sudo raspi-config

Si necesita salir de nuevo al símbolo del sistema CTRL+ ALT+F1

CTRL+ ALT+F2


0

Puede colocar su script en la parte inferior del /etc/profilearchivo.

Otras opciones no funcionaron para mí, pero esto quizás sea porque puse mi script en el escritorio.


0

cree un archivo .sh con los comandos 'python /path/to/your/script.py' escriba 'sudo nano /etc/rc.local' y escriba la ruta al archivo .sh

antes de

exit 0

O simplemente podrías escribir

crontab -e

o

sudo crontab -e 

si desea que el script se ejecute al inicio

dentro del tipo de archivo

@reboot python /path/to/your/script.py &

2
¡Se recomienda encarecidamente el uso de rutas completas para las entradas de crontab!
Ghanima

-2

que funciona. (En cada reinicio, prepare los siguientes envíos automáticamente)

$ cat /etc/rc.local
#!/bin/sh -e
echo "18" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio18/direction
echo "1" > /sys/class/gpio/gpio18/value
exit 0

-2

Esto es lo que generalmente hago.

  1. Almacene su archivo en el directorio de inicio de raspberry pi. Por ejemplo: mycode.py
  2. Edite el archivo:

    sudo nano .bashrc

.bashrcNO está destinado a ejecutar scripts.

Se ejecuta cada vez que se inicia un shell interactivo sin inicio de sesión y se utiliza para configurar el shell.
~/.bashrc: executed by bash(1) for non-login shells.

  1. Ve al final del archivo y escribe:

    sudo python mycode.py

  2. Si desea que la salida se almacene en un archivo txt, edite el código en el Paso 3 de la siguiente manera:

    sudo python mycode.py >> output.py

¡Espero que esto ayude!