Esecuzione di uno script Python all'avvio


29

Questa domanda è stata posta alcune volte prima, ma non mi è sembrato di farlo funzionare utilizzando le informazioni esistenti.

Il mio Pi esegue Raspbian. Ho uno script Python di nome dnscheck.py che gira per sempre.

Ho bisogno che funzioni all'avvio. So che devo creare un file .sh contenente qualcosa di simile

sudo python dnscheck.py &

Quello che non so è dove dovrebbe essere questo file o se dovrebbe contenere qualcos'altro. Conosco la cartella init.d, ma vedendo l'esempio di scheletro immagino che dovrebbe esserci un modo più semplice per fare questo semplice compito.


per un modo davvero semplice controlla questo tutorial passo dopo passo -> youtu.be/Tvnrx-2QaUU crea tutti i lanciatori di cui hai bisogno e contattali tutti in crontab
Hossein RM

Risposte:


20

Se vuoi controllare il processo con comandi come start, stop, restart ecc. Usando lo script skeleton e modificandolo per i tuoi scopi potrebbe essere l'opzione migliore.

Se vuoi solo avviare il processo, inserisci il comando /etc/rc.local. (Non ho il mio RPi a portata di mano, ma ho letto online che c'è una riga 'exit 0' lì dentro, dovresti mettere il tuo comando sopra questa riga)


1
Ha funzionato! Devo aggiungere che l'impostazione delle autorizzazioni per lo script e rc.local su 755 (lettura / scrittura / esecuzione) è un must. Non sono sicuro che entrambi abbiano bisogno di questa impostazione, ma ha funzionato per me. Grazie mille per l'aiuto!
Vlad Schnakovszki il

7
"come l'hai scritto nella tua domanda" Non proprio - non hai bisogno di sudo perché rc.localesegue root. Dovresti anche specificare il percorso completo dello script, ovviamente. Dovresti anche aggiungere& alla fine in modo che le forcelle dello script, ad es /path/to/foobar.py &.
Riccioli d'oro

1
@goldilocks potresti spiegare perché devo aggiungere &? Perché quando uso senza di esso, tutto funziona ancora come previsto.
Huy.PhamNhu,

2
@ Huy.PhamNhu Rispondere alla tua domanda: Pi eseguirà questo programma all'avvio e prima che vengano avviati altri servizi. Se non includi la e commerciale e se il tuo programma viene eseguito continuamente, il Pi non completerà il processo di avvio. La e commerciale consente al comando di essere eseguito in un processo separato e di continuare l'avvio con il processo principale in esecuzione.
Amine Harbaoui,

6

Sposta il tuo script (lo salveremo nel file dnscheck) in /etc/init.d/e imposta le autorizzazioni in modo che possa essere eseguito:

chmod 755 /etc/init.d/dnscheck

Aggiungi tag init LSB nella parte superiore dello script. Probabilmente vorrai cambiare Required-Start / Stop e i Tag descrizione per adattarli allo 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

Quindi creare i collegamenti simbolici eseguendo

update-rc.d /etc/init.d/dnscheck defaults

2
Per favore, non che questa sia stata una risposta decente 3 1/2 anni fa e continuerà a funzionare perché il nuovo sistema init di Raspbian è retrocompatibile con gli script in stile LSB / SysV, ma i nuovi utenti farebbero meglio a imparare a usare il nuovo sistema ( systemd ) se l'aggiunta di una riga a /etc/rc.localnon è sufficiente.
Riccioli d'oro

3

Esistono molti modi per farlo, ovviamente, ma non dimenticare di usarlo cron. Se metti una @rebootlinea nel tuo crontab, quel comando verrà eseguito ad ogni riavvio.

Per testare, ho appena aggiunto la seguente riga al mio crontab utente con crontab -e: @reboot echo "$(date)" >> ~/boot.txt Il vantaggio di questo metodo è che puoi chiamare il lavoro come richiesto ad altri intervalli oltre al solo tempo di avvio e non devi modificare gli script di init.


3

se si utilizza il file rc.local, ciò può essere utile per la risoluzione dei problemi. È possibile aggiungere righe di registrazione per registrare gli errori (stderr) e generare l'output (stdout) nel file di registro. Secondo questo esempio, quel file salva in /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

Leggi di più


3

Sono davvero sorpreso che i demonoli di DJB non siano menzionati qui. Daemontools esegue una corretta supervisione del processo ed è possibile aggiungere funzioni interessanti come la registrazione ruotata automaticamente. TL; DR se non si ha familiarità con nulla di tutto ciò, il processo verrà riavviato ogni volta che fallisce e si avvia automaticamente all'accensione del Pi. Questo è fantastico se hai scritto un cattivo programma Python che ha modalità di errore ma non vuoi che muoia se si verifica un errore.

Installare:

sudo apt-get install daemontools daemontools-run

Quindi seguire i passaggi per creare processi daemonizzati:

È per lo più semplice come copiare uno runscript in un /etc/service/<my_custom_service_name>altro vantaggio: puoi eseguirlo come qualsiasi utente o root! Dettagli nel link.

FWIW Avevo un progetto Pi in cui avevo 3 diversi processi Python (ognuno aveva un ciclo di esecuzione che utilizzava il tempo della CPU, quindi usando 3 processi ho permesso a ciascun processo di sfruttare 1 core della CPU). Daemontools mi ha permesso di assicurarmi che tutti e 3 funzionassero automaticamente e continuassero a funzionare dopo aver collegato il Pi.


soluzione semplice e facile, la tua risposta ti ha risparmiato molto tempo, grazie ..
ShivaGuntuku,

2

Ecco la soluzione che uso costantemente.

Crea un file desktop

xyz.desktop

digitare quanto segue in esso

[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

incolla questo file nel file

/home/pi/.config/autostart/

e riavvia il tuo Raspberry Pi e dovrebbe eseguire automaticamente il tuo programma in un nuovo terminale


per favore non tagliare e incollare le risposte a più domande. Se la risposta è la stessa, la versione più recente deve essere contrassegnata come duplicata.
Steve Robillard,

L'unico motivo per cui non l'ho fatto è stato perché questa pagina aveva un numero maggiore di visualizzazioni rispetto all'altra.
evolutionizer

@SteveRobillard Inoltre non credo di avere il rappresentante richiesto per farlo
evolutionizer

Contrassegnare un post richiede solo 15 ripetizioni. Decidere cosa fare al riguardo è compito dei moderatori, quindi il numero di visualizzazioni è irrilevante. Le risposte duplicate vengono automaticamente contrassegnate dal sistema. Sono una forma di gioco del sistema. Pertanto, ho eliminato il terzo.
Steve Robillard,

@SteveRobillard Grazie per l'informazione e perdona la mia ignoranza. Ho lì per contrassegnare la domanda precedente come duplicata.
evolutionizer il

2

Per utilizzare un file .py, basta mettere la linea #!/usr/bin/pythonall'inizio del file. Quindi renderlo eseguibile con chmod +x filename. Avanti, aggiungere la riga /path/to/file.py &alla /etc/rc.localprima della exit 0riga (lo scambio /path/to/file.pycon il percorso allo script). Questo renderà il tuo script Python eseguito alla fine del boot.


0

Ecco un metodo ancora più semplice che ha funzionato per me. Modifica l'avvio automatico in LXDE.

Aprire un terminale e modificare il file di avvio automatico come segue:

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

aggiungi la seguente riga di testo in basso (modifica il percorso secondo necessità in cui si trova il tuo esempio.py)

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

ctr-x e salva. Potrebbe essere necessario rendere eseguibile lo script python come segue:

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

riferimento per l'avvio automatico in LXDE e riferimento per rendere eseguibile python


Nota che questo non funzionerà se non ti avvii in una GUI (es: corri il tuo pi senza testa)
Havnar

0

queste soluzioni non hanno funzionato per me cercando di avviare uno script Python con l'esecuzione di Feh. Il seguente ha funzionato. Avvia uno script dopo il login.

Apri una sessione terminale e modifica il file

sudo nano /etc/profile

Aggiungi la seguente riga alla fine del file

/home/pi/your_script_name.sh

sostituire il nome e il percorso dello script con il nome e il percorso corretti dello script di avvio. Salva ed esci

Premi Ctrl + X per uscire dall'editor nano seguito da Y per salvare il file.

Ecco come appariva il mio script.sh:

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

Penso di aver reso eseguibili sia script.sh che script.py usando chmod

sudo chmod +x home/pi/your_script_name.sh
sudo chmod +x home/pi/your_python_script.py
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.