Eseguire lo script all'avvio


188

Sto cercando di eseguire uno script all'avvio del mio Raspberry Pi. Vorrei che il browser web si aprisse automaticamente.

Ho provato a trovare una soluzione semplice, (come far cadere il mio script in una directory di "avvio" o qualcosa di simile) ma non vedo nulla del genere.

Ho esaminato Upstart , ma sto lottando per capire come funziona. Tutti gli script che ho provato non hanno funzionato quando li provo.


4
Quale sistema operativo stai utilizzando? In FreeBSD, che sto usando sul mio Pi, puoi aggiungere script di avvio a /usr/local/etc/rc.d/, o semplicemente aggiungere cose a /etc/rc.local. Diverse distribuzioni Linux hanno diversi metodi consigliati. Se stai eseguendo X su di esso, allora dovresti cercare di aggiungere cose al tuo .xinitrco al .xsessionfile.
ghoti,

Maggiori informazioni sul processo di avvio di X sono disponibili qui .
ghoti,

6
Si prega di notare che la risposta accettata qui ha alcuni avvertimenti e tecnicamente non avvia nulla all'avvio tranne in condizioni specifiche. Leggilo attentamente.
riccioli d'oro

Stai chiedendo uno script che viene eseguito quando accedi, non quando il pi si avvia o all'avvio. Due cose molto diverse, e il titolo sta distorcendo i risultati di ricerca di Google.
IAmNaN

Risposte:


196

Per eseguire Midori all'avvio, dai un'occhiata a questo tutorial . Per soluzioni fai-da-te, continua a leggere.


È possibile aggiungere il comando eseguibile dello script in fondo .bashrcche eseguirà lo script ogni volta che si apre un terminale (o si esegue una nuova istanza di bash) .

  1. Assicurati di essere nella picartella:

    $ cd ~
    
  2. Crea un file e scrivi uno script per eseguirlo nel file:

    $ sudo nano superscript
    
  3. Salvare e uscire: Ctrl+ X, Y,Enter

  4. Apri .bashrcper la configurazione:

.bashrcNON è destinato all'esecuzione di script.

Viene eseguito ogni volta che viene avviata una shell interattiva senza accesso e viene utilizzata per configurare la shell.
~/.bashrc: executed by bash(1) for non-login shells.

   $ sudo nano .bashrc
  1. Scorri verso il basso e aggiungi la riga: ./superscript

  2. Salvare e uscire: Ctrl+ X, Y,Enter


Se stai cercando una soluzione che funzioni all'avvio della console , dai un'occhiata a questo link . Rundown di base:

  1. Crea un file per il tuo script di avvio e scrivi il tuo script nel file:

    $ sudo nano /etc/init.d/superscript
    
  2. Salvare e uscire: Ctrl+ X, Y,Enter

  3. Rendi eseguibile lo script:

    $ sudo chmod 755 /etc/init.d/superscript
    
  4. Registra lo script da eseguire all'avvio:

    $ sudo update-rc.d superscript defaults
    

Se si desidera eseguire uno script all'avvio nell'ambiente LXDE , è possibile dare un'occhiata a questo post sul forum di Raspberry Pi :

  1. Navigare verso ~/.config/lxsession/LXDE-pi

  2. Apri il autostartfile in quella cartella:

    $ sudo nano autostart
    
  3. Aggiungi @midorisu una nuova riga. Se vuoi eseguire qualcosa di simile a uno script Python, metti qualcosa di simile @python mypython.pysu una nuova riga. L'esecuzione di un file di script sarebbe @./superscript, ma per qualche motivo lo script viene eseguito in un ciclo infinito (forse questo lo fermerà).

  4. Salvare e uscire: Ctrl+ X, Y,Enter

  5. Riavvia il tuo Raspberry Pi nell'ambiente LXDE.


Il tutorial sulla configurazione di Midori all'avvio era proprio quello che stavo cercando. Non sono sicuro del perché ci siano così tanti modi per fare una cosa così semplice, ma sono contento che funzioni ora.
Tyler Murry,

1
@ syb0rg La parte Esegui al login funziona come un incantesimo (+1) se eseguo l'accesso tramite ssh, ma non quando inizia la sessione desktop di lxde. c'è un modo per farlo?
George Profenza,

@GeorgeProfenza Quando lo fai $ sudo startx?
syb0rg,

2
Volevo solo sottolineare che lo script pyhton verrà eseguito, ma se ci sono errori, sarà solo da qualche parte in background usando il metodo / etc / xdg / lxsession / LXDE / autostart. l'uso di .barshrc rivelerà anche errori, ma è davvero importante assicurarsi che lo script sia stretto in primo luogo (scoperto che nel modo più duro :))
George Profenza,

7
.bashrcnon viene letto all'avvio del sistema o quando un utente accede , solo quando apre un nuovo terminale (e viene letto ogni volta che l'utente apre un nuovo terminale). Sono sconcertato che questa risposta abbia ottenuto così tanti voti positivi: la prima parte è chiaramente sbagliata . La terza parte è corretta per eseguire un programma GUI.
Gilles,

46

Il modo in cui ho visto la maggior parte delle persone farlo (dai un'occhiata ai forum di Raspberry Pi) e mi sono fatto successo è usare /etc/rc.local.

Tutto quello che devi fare qui è inserire ./myscriptil file di testo rc.local. Se è in Python, metti python myscript.py.

Questa è letteralmente "una soluzione semplice, (come rilasciare il mio script in una directory di" avvio "o qualcosa di simile)" - forse cercare nei forum anche quando si hanno domande, questa soluzione è emersa sui primi 4 risultati di un ricerca Google!


4
Cordiali saluti, il rc.local di default ha vari commenti sullo script che non fa nulla e che ha bisogno di bit eseguibili modificati. Questo non è vero, basta inserire il comando per lo script prima dell'uscita 0 e verrà eseguito all'avvio. Assicurati che lo script esca dalle esecuzioni in background o bloccherà la richiesta di accesso. Sì, questo è quello che ho fatto.
rapina il


@rob Vuoi dire che suggeriscono che lo script sia impostato come eseguibile? Questo è mitigato nella domanda eseguendo lo script dal comando python myscript.py. Se si vuole chmod + x e aggiungere #! /bin/python, è possibile eseguire lo script facendo $pathtofile/myscript.pydove $pathtofileè .se siete nella stessa directory o il percorso assoluto o relativo al file.
JFA,

1
Non va bene per un programma GUI come un browser. /etc/rc.localè solo per avviare i servizi di sistema (programmi che non hanno un'interfaccia utente).
Gilles,

1
@ ErickM.Sprengel Usa una delle risposte corrette su questo thread, come questa .
Gilles,

32

Aggiungilo al crontab

Crontab esegue i comandi in momenti definiti.


Modifica il file:

sudo crontab -e

Aggiungi riga al file (qui uno script Python):

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

2
Per essere un po 'pignoli qui, tecnicamente non è crontab che esegue il comando, ma comunque. Per quanto riguarda la riga elencata da aggiungere, si consiglia di inserire percorsi completi per i comandi definiti qui (in questo caso il percorso completo per python3), vedere qui
Ghanima

Questo è il metodo che ho sempre usato per la sua semplicità. +1
Patrick Cook

Non va bene per un programma GUI come un browser. /etc/rc.localè solo per avviare programmi che non hanno un'interfaccia utente.
Gilles,

2
Dopo aver passato molto tempo a cercare di farlo funzionare con rc.local e init.d e ogni altra cosa .. questo ha funzionato subito! Grazie!
Piotr Kula,

4
questo non funziona per qualche motivo in rpi os
Denis

11

Avvio automatico delle app xorg

Se lo script che desideri avviare richiede una sessione xorg, potresti provare a seguire le specifiche di avvio automatico di freedesktop che potrebbero funzionare o meno a seconda dell'ambiente desktop che stai utilizzando.

In alternativa, puoi scegliere come target il tuo specifico ambiente desktop come descritto su https://wiki.archlinux.org/index.php/autostarting .

Esecuzione di uno script come servizio systemd

Se il tuo script si adatta alla descrizione di un demone o di un 'servizio' e il tuo sistema sta eseguendo systemd, come nel caso di raspbian e della maggior parte dei moderni, allora puoi configurare il tuo script per essere eseguito come un servizio systemd - questo fornisce un controllo granulare su il ciclo di vita e l'ambiente di esecuzione, nonché i presupposti per (ri) avviare lo script, come ad esempio la rete in esecuzione. È anche possibile configurare il riavvio del servizio in caso di errore ( Restart=alwayse ritardo tra il riavvio, ad es RestartSec=10.).

Per un utilizzo a livello di sistema, creare il proprio file di unità di sistema sotto /etc/systemd/system, ad esempio 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

Guarda anche:

Ora siamo pronti per testare il servizio:

systemctl start autossh

Verifica dello stato del servizio:

systemctl status autossh

Interruzione del servizio:

systemctl stop autossh

Dopo aver verificato che il servizio funziona come previsto, abilitarlo con:

systemctl enable autossh

NOTA: per motivi di sicurezza, systemdlo script verrà eseguito in un ambiente limitato, in modo simile a come crontabvengono eseguiti gli script, quindi non fare ipotesi sulle variabili di sistema preesistenti. Utilizzare le Environmentchiavi se lo script necessita di variabili specifiche da definire. L'aggiunta set -xnella parte superiore dello script bash e quindi l'esecuzione systemctl status my_servicepotrebbe aiutare a identificare il motivo per cui lo script non riesce. Come regola di tumb, usa sempre percorsi assoluti per tutto ciò che include echoe cat, o definisci esplicitamente il tuo $ PATH.


7

Voglio mettere i miei due centesimi, anche se questa è una vecchia domanda, ma comunemente chiesto di fare una cosa semplice: l'avvio automatico. Ho provato tutte le soluzioni suggerite in tutte le risposte a questa domanda. Nessuno di loro ha lavorato per me. Sto usando Raspberry PI Model 2 con Raspbian.

L'unico modo in cui sono riuscito ad avviare correttamente la mia applicazione è tramite uno script come segue. Dico con successo perché la mia applicazione è stata avviata come previsto senza problemi come iniziare con un percorso di lavoro errato.

1.Crea un file vuoto con estensione .sh e chiamalo come preferisci.

2. Copia e incolla ESATTAMENTE quanto segue, tranne cambia "il nome della tua applicazione" con il nome dello script appena creato.

 #! /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. Quindi, salva il file di script nella cartella dell'applicazione

  2. Quindi, apri la /home/pi/.config/autostartcartella. Potrebbe essere diverso nel tuo caso. Basta aprire la cartella principale e abilitare Visualizza cartelle nascoste. aperto .config/autostart. Se non vedi la cartella di avvio automatico, crea una cartella chiamata avvio automatico nella cartella .config.

  3. all'interno della cartella di avvio automatico dovrai creare un collegamento al file di script che hai creato come segue. Crea un file vuoto con estensione .desktop.

  4. Copia e incolla il seguente nel file del desktop vuoto tranne che è necessario cambiare Comment, Name, Exec, Pathe Iconil valore 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. Salvare e chiudere il file dopo aver modificato tutti i campi necessari. Hai fatto. Provalo e basta.


Tecnicamente questo script è gestito dal sistema piuttosto che da un utente specifico - quindi forse la tua applicazione appartiene meglio a /usr/local/bin/ApplicationName...?
SlySven,

@SlySven "il sistema" è un utente specifico.
Espiazione limitata il

Viene eseguito come root (UID = 0) o l'utente pi (UID ~ 500 o 1000 IIRC) - se viene eseguito come root o un altro UID di sistema (meno di 500), è tradizionalmente buona norma archiviare il file di script ( o qualsiasi altro da cui dipende) sul dispositivo root in modo tale che non ci siano problemi con qualsiasi altro dispositivo (ad esempio homese si tratta di un dispositivo separato) non ci sarà un problema con il file di script (o un file eseguibile) che non sarà disponibile quando il il sistema ritorna su una singola /bin/shshell utente ! Oggi è il systemdmodo di montare entrambi /e /usrprima dell'inizio del PID 1 ...
SlySven,

5

Ho anche avuto problemi con questo. Sul Raspberry Pi3 con Raspbian è quello che ho fatto:

  1. Crea uno script della shell di avvio nella tua directory principale (ho chiamato il mio "launch"):

sudo leafpad launch.sh

  1. Salva il file
  2. Modifica il file di avvio automatico LXDE-pi

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

  1. Aggiungi questo in fondo a quel file

./launch.sh

  1. riavvio

3

Sul Raspberry Pi3 con Raspbian Stretch questo è quello che ho fatto:

Modifica il file di avvio automatico LXDE-pi

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

Aggiungi questo in fondo a quel file

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

salva e riavvia


1

Metodo 1:

Per avviare un comando automaticamente all'accesso, inserire il comando in un file denominato

.bashrc

nella directory utente (ad esempio / home / pi)

.bashrcNON è destinato all'esecuzione di script.

Viene eseguito ogni volta che viene avviata una shell interattiva senza accesso e viene utilizzata per configurare la shell.
~/.bashrc: executed by bash(1) for non-login shells.

Ad esempio, il file potrebbe contenere

chromium-browser --kiosk www.google.com

per avviare Chromium a schermo intero puntato su www.google.com


Metodo 2:

Questa soluzione funziona davvero bene. Una volta caricato il browser, nella parte in alto a sinistra dello schermo è presente un quadratino nero che sembra essere un bug generale (è menzionato negli altri forum) ma per il resto la modalità a schermo intero nasconde tutto tranne la pagina del browser.

Modifica il file di avvio automatico:

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

Commenta tutto usando un '#' all'inizio di ogni riga e poi aggiungi le seguenti righe

Esegui automaticamente il browser

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

Se necessario, utilizzare lo strumento di configurazione per abilitare l'esecuzione automatica della GUI all'accensione

sudo raspi-config

Se è necessario tornare al prompt dei comandi CTRL+ ALT+F1

CTRL+ ALT+F2


0

È possibile posizionare lo script nella parte inferiore del /etc/profilefile.

Altre opzioni non hanno funzionato per me, ma forse perché ho inserito il mio script sul desktop.


0

crea un file .sh con i comandi 'python /path/to/your/script.py' digita 'sudo nano /etc/rc.local' e digita il percorso del file .sh

prima

exit 0

Oppure potresti semplicemente digitare

crontab -e

o

sudo crontab -e 

se si desidera eseguire lo script all'avvio

all'interno del file digitare

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

2
L'uso di percorsi completi è fortemente incoraggiato per le voci crontab!
Ghanima

-2

esso funziona. (Ad ogni riavvio, prepara automaticamente i seguenti invii)

$ 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

Questo è ciò che generalmente faccio.

  1. Archivia il tuo file nella home directory di raspberry pi. Ad esempio: mycode.py
  2. Modifica il file:

    sudo nano .bashrc

.bashrcNON è destinato all'esecuzione di script.

Viene eseguito ogni volta che viene avviata una shell interattiva senza accesso e viene utilizzata per configurare la shell.
~/.bashrc: executed by bash(1) for non-login shells.

  1. Vai alla fine del file e scrivi:

    sudo python mycode.py

  2. Se si desidera che l'output sia archiviato in un file txt, modificare il codice al passaggio 3 come segue:

    sudo python mycode.py >> output.py

Spero che sia di aiuto!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.