Exécution d'un script Python au démarrage

29

Cette question a été posée à plusieurs reprises auparavant, mais je n'ai pas semblé la faire fonctionner en utilisant les informations existantes.

Mon Pi exécute Raspbian. J'ai un script Python nommé dnscheck.py qui boucle pour toujours.

J'en ai besoin pour fonctionner au démarrage. Je sais que je dois créer un fichier .sh contenant quelque chose comme

sudo python dnscheck.py &

Ce que je ne sais pas, c'est où ce fichier doit être ou s'il doit contenir autre chose. Je connais le dossier init.d, mais en voyant l'exemple squelette, j'imagine qu'il devrait y avoir un moyen plus simple de faire cette tâche simple.

Vlad Schnakovszki
la source
pour un moyen vraiment simple de vérifier ce tutoriel étape par étape -> youtu.be/Tvnrx-2QaUU faites autant de lanceurs que vous en avez besoin et adressez-les tous dans crontab
Hossein RM

Réponses:

20

Si vous souhaitez contrôler le processus avec des commandes comme démarrer, arrêter, redémarrer, etc. en utilisant le script squelette et le modifier à vos fins pourrait être la meilleure option.

Si vous voulez simplement que le processus démarre, entrez la commande dans /etc/rc.local. (Je n'ai pas mon RPi à portée de main, mais j'ai lu en ligne qu'il y a une ligne 'exit 0' là-dedans, vous devriez mettre votre commande au-dessus de cette ligne)

ikku
la source
1
Ça a marché! Je dois ajouter que la définition des autorisations pour le script et rc.local à 755 (lecture / écriture / exécution) est un must. Je ne sais pas si les deux ont besoin de ce paramètre, mais cela a fonctionné pour moi. Merci beaucoup pour l'aide!
Vlad Schnakovszki
7
"comme vous l'avez écrit dans votre question" Pas tout à fait - vous n'avez pas besoin de sudo en tant que rc.localroot. Vous devez également spécifier le chemin complet du script, évidemment. Vous devez également ajouter& à la fin afin que le script se bifurque, par exemple /path/to/foobar.py &.
goldilocks
1
@goldilocks pourriez-vous s'il vous plaît expliquer pourquoi dois-je ajouter &? Parce que quand je l'utilise sans, tout fonctionne toujours comme prévu.
Huy.PhamNhu
2
@ Huy.PhamNhu Répondre à votre question: le Pi exécutera ce programme au démarrage et avant le démarrage des autres services. Si vous n'incluez pas l'esperluette et si votre programme s'exécute en continu, le Pi ne terminera pas son processus de démarrage. L'esperluette permet à la commande de s'exécuter dans un processus distinct et de continuer le démarrage avec le processus principal en cours d'exécution.
Amine Harbaoui
6

Déplacez votre script (nous l'enregistrerons dans le fichier dnscheck) dans /etc/init.d/et définissez les autorisations pour qu'il puisse être exécuté:

chmod 755 /etc/init.d/dnscheck

Ajoutez des balises d'initialisation LSB en haut de votre script. Vous souhaiterez probablement modifier Required-Start / Stop et les balises de description pour les adapter à votre 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

Créez ensuite les liens symboliques en exécutant

update-rc.d /etc/init.d/dnscheck defaults
Bert
la source
2
Veuillez noter que même si cette réponse était décente il y a 3 ans et demi et fonctionnera toujours parce que le nouveau système d'initialisation de Raspbian est rétrocompatible avec les scripts de style LSB / SysV, les nouveaux utilisateurs feraient mieux d'apprendre à utiliser le nouveau système à la place ( systemd ) si l'ajout d'une ligne à /etc/rc.localest insuffisant.
goldilocks
3

Il y a bien sûr de nombreuses façons de le faire, mais n'oubliez pas d'utiliser cron. Si vous mettez une @rebootligne dans votre crontab, cette commande sera exécutée à chaque redémarrage.

Pour tester, je viens d'ajouter la ligne suivante à mon utilisateur crontab avec crontab -e: @reboot echo "$(date)" >> ~/boot.txt Le bonus de cette méthode est que vous pouvez appeler le travail comme requis à d'autres intervalles en plus du temps de démarrage, et vous n'avez pas à modifier les scripts d'initialisation.

bobstro
la source
3

si vous utilisez le fichier rc.local, cela peut être utile pour le dépannage. Vous pouvez ajouter des lignes de journalisation pour consigner les erreurs (stderr) et la sortie de commande (stdout) dans le fichier journal. Selon cet exemple, ce fichier est enregistré dans /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

Lire la suite

Tharanga
la source
3

Je suis vraiment surpris que les daemontools de djb ne soient pas mentionnés ici. Daemontools effectue une supervision appropriée des processus et vous pouvez ajouter des fonctionnalités intéressantes telles que la journalisation avec rotation automatique. TL; DR si vous n'êtes pas familier avec tout cela, votre processus sera redémarré à chaque échec et démarrera automatiquement lorsque votre Pi s'allumera. C'est génial si vous avez écrit un mauvais programme python qui a des modes de défaillance mais vous ne voulez pas qu'il meure simplement en cas d'erreur.

Installer:

sudo apt-get install daemontools daemontools-run

Suivez ensuite les étapes pour créer des processus démonisés:

C'est surtout aussi simple que de copier un runscript dans un /etc/service/<my_custom_service_name>autre avantage: vous pouvez exécuter n'importe quel utilisateur ou root! Détails dans le lien.

FWIW J'avais un projet Pi où j'avais 3 processus python différents (chacun avait une boucle d'exécution utilisant le temps CPU donc en utilisant 3 processus j'ai permis à chaque processus de tirer parti d'un cœur CPU). Daemontools m'a permis de m'assurer que les 3 s'exécuteraient automatiquement et continueraient de fonctionner après avoir branché le Pi.

Sam
la source
solution simple et facile, votre réponse a permis de gagner beaucoup de temps, merci ..
ShivaGuntuku
2

Voici la solution que j'utilise constamment.

Créer un fichier de bureau

xyz.desktop

tapez ce qui suit en elle

[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

collez ce fichier dans le

/home/pi/.config/autostart/

et redémarrez votre framboise pi et il devrait exécuter automatiquement votre programme dans un nouveau terminal

évolutionniste
la source
veuillez ne pas copier-coller les réponses à plusieurs questions. Si la réponse est la même, la version la plus récente doit être signalée comme doublon.
Steve Robillard
La seule raison pour laquelle je ne l'ai pas fait était que cette page avait un plus grand nombre de vues que l'autre.
evolutionizer
@SteveRobillard Je ne pense pas non plus avoir le représentant requis pour le faire
evolutionizer
Signaler un message ne prend que 15 répétitions. Décider quoi faire à ce sujet est le travail des modérateurs - donc le nombre de vues n'est pas pertinent. Les réponses en double sont automatiquement signalées par le système. Ils sont une forme de jeu du système. J'ai donc supprimé le troisième.
Steve Robillard
@SteveRobillard Merci pour l'information et pardonnez mon ignorance. J'ai là pour signalé la question précédente en double.
evolutionizer
2

Pour utiliser un fichier .py, placez simplement la ligne #!/usr/bin/pythonau tout début de votre fichier. Rendez-le ensuite exécutable avec chmod +x filename. Ensuite, ajoutez la ligne /path/to/file.py &à /etc/rc.localavant la exit 0ligne (échange /path/to/file.pyavec le chemin de votre script). Cela fera exécuter votre script python à la fin du démarrage.

Théorémiseur
la source
0

Voici une méthode encore plus simple qui a fonctionné pour moi. Modifiez le démarrage automatique dans LXDE.

Ouvrez un terminal et modifiez le fichier de démarrage automatique comme suit:

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

ajoutez la ligne de texte suivante en bas (modifiez le chemin d'accès à l'endroit où se trouve votre exemple.py)

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

ctr-x et enregistrez. Vous devrez peut-être rendre le script python exécutable comme suit:

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

référence pour le démarrage automatique dans LXDE et référence pour rendre exécutable python

hydronique
la source
Notez que cela ne fonctionnera pas si vous ne démarrez pas dans une
interface graphique
0

ces solutions n'ont pas fonctionné pour moi en essayant de démarrer un script python avec l'exécution de Feh. Ce qui suit a fonctionné. Il démarre un script après la connexion.

Ouvrez une session de terminal et modifiez le fichier

sudo nano /etc/profile

Ajoutez la ligne suivante à la fin du fichier

/home/pi/your_script_name.sh

remplacez le nom et le chemin du script par le nom et le chemin corrects de votre script de démarrage. Sauvegarder et quitter

Appuyez sur Ctrl + X pour quitter l'éditeur nano, puis sur Y pour enregistrer le fichier.

Voici à quoi ressemblait mon script.sh:

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

Je pense que j'ai fait à la fois l'exécutable script.sh et script.py en utilisant le chmod

sudo chmod +x home/pi/your_script_name.sh
sudo chmod +x home/pi/your_python_script.py
hydronique
la source