Exécuter le script au démarrage

188

J'essaie d'exécuter un script lorsque mon Raspberry Pi démarre. J'aimerais que le navigateur Web s'ouvre automatiquement.

J'ai essayé de trouver une solution simple (par exemple, déposer mon script dans un répertoire de "démarrage" ou quelque chose de similaire), mais je ne vois rien de tel.

J'ai examiné Upstart , mais j'ai du mal à comprendre comment cela fonctionne. Tous les scripts que j'ai essayés n'ont pas fonctionné lorsque je les ai testés.

Tyler Murry
la source
4
Quel système d'exploitation utilisez-vous? Dans FreeBSD, que j'utilise sur mon Pi, vous pouvez ajouter des scripts de démarrage dans /usr/local/etc/rc.d/, ou simplement ajouter des éléments dans /etc/rc.local. Différentes distributions Linux ont différentes méthodes recommandées. Si vous utilisez X sur cette application, vous devriez peut-être envisager d'ajouter des éléments à votre fichier .xinitrcou .xsession.
Ghoti
Plus d'informations sur le processus de démarrage X peuvent être trouvées ici .
Ghoti
6
Veuillez noter que la réponse acceptée ici présente des réserves et que techniquement, rien ne démarre au démarrage, sauf dans des conditions spécifiques. Lisez-le attentivement.
Boucle d'or
Vous demandez un script qui s'exécute lorsque vous vous connectez, pas lorsque pi démarre ou au démarrage. Deux choses très différentes, et le titre déforme les résultats de la recherche Google.
IAmNaN

Réponses:

196

Pour exécuter Midori au démarrage, consultez ce didacticiel . Pour des solutions de bricolage, lisez la suite.


Vous pouvez ajouter votre commande exécutable de script au bas de .bashrccelui-ci pour exécuter votre script à chaque fois que vous ouvrez un terminal (ou exécutez une nouvelle instance de bash) .

  1. Assurez-vous que vous êtes dans le pidossier:

    $ cd ~
    
  2. Créez un fichier et écrivez un script à exécuter dans le fichier:

    $ sudo nano superscript
    
  3. Sauvegardez et quittez: Ctrl+ X, Y,Enter

  4. Ouvrir .bashrcpour configuration:

.bashrcn'est PAS destiné à exécuter des scripts.

Il est exécuté chaque fois qu'un shell interactif sans connexion est démarré et est utilisé pour configurer le shell.
~/.bashrc: executed by bash(1) for non-login shells.

   $ sudo nano .bashrc
  1. Faites défiler vers le bas et ajoutez la ligne: ./superscript

  2. Sauvegardez et quittez: Ctrl+ X, Y,Enter


Si vous recherchez une solution qui fonctionne au démarrage de la console , consultez ce lien . Résumé de base:

  1. Créez un fichier pour votre script de démarrage et écrivez votre script dans le fichier:

    $ sudo nano /etc/init.d/superscript
    
  2. Sauvegardez et quittez: Ctrl+ X, Y,Enter

  3. Rendre le script exécutable:

    $ sudo chmod 755 /etc/init.d/superscript
    
  4. Enregistrer le script à exécuter au démarrage:

    $ sudo update-rc.d superscript defaults
    

Si vous voulez qu'un script soit exécuté lorsque vous démarrez dans l'environnement LXDE , vous pouvez jeter un oeil à ce message du forum Raspberry Pi :

  1. Aller vers ~/.config/lxsession/LXDE-pi

  2. Ouvrez le autostartfichier dans ce dossier:

    $ sudo nano autostart
    
  3. Ajouter @midorisur une nouvelle ligne. Si vous voulez exécuter quelque chose comme un script python, mettez quelque chose comme @python mypython.pyune nouvelle ligne. Exécuter un fichier de script serait @./superscript, mais pour une raison quelconque, le script s'exécute dans une boucle infinie (peut - être que cela arrêtera cela).

  4. Sauvegardez et quittez: Ctrl+ X, Y,Enter

  5. Redémarrez votre Raspberry Pi dans l'environnement LXDE.

syb0rg
la source
Le tutoriel sur la configuration de Midori au démarrage était exactement ce que je cherchais. Je ne sais pas pourquoi il y a tant de façons de faire une chose aussi simple, mais je suis heureux que cela fonctionne maintenant.
Tyler Murry
1
@ syb0rg La partie exécuter lors de la connexion fonctionne comme un charme (+1) si je me connecte via ssh, mais pas lorsque la session de bureau lxde démarre. Y-a-t-il un moyen de faire ça ?
George Profenza
@ GeorgeProfenza Quand vous faites $ sudo startx?
syb0rg
2
Je voulais juste signaler que le script pyhton sera exécuté, mais s'il y a des erreurs, ce sera quelque part en arrière-plan en utilisant la méthode / etc / xdg / lxsession / LXDE / autostart. utiliser .barshrc va aussi révéler des erreurs, mais il est vraiment important de s'assurer que le script est serré en premier lieu (
j'ai
7
.bashrcn'est pas lu au démarrage du système ou lorsqu'un utilisateur se connecte , uniquement lors de l'ouverture d'un nouveau terminal (et il est lu à chaque fois que l'utilisateur ouvre un nouveau terminal). Je suis déconcerté par le fait que cette réponse a eu tant de votes positifs: la première partie est tout simplement fausse . La troisième partie est correcte pour exécuter un programme graphique.
Gilles
46

La façon dont j'ai vu la plupart des gens le faire (regardez sur les forums de Raspberry Pi) et que je me suis fait avec succès utilise /etc/rc.local.

Tout ce que vous devez faire ici est placé ./myscriptdans le fichier texte rc.local. Si c'est en python, mettez python myscript.py.

C’est littéralement "une solution simple (comme de déposer mon script dans un répertoire" de démarrage "ou quelque chose de similaire) - vous pouvez également effectuer une recherche sur les forums lorsque vous avez des questions, cette solution est apparue sur les 4 premiers résultats recherche Google!

avidreader610
la source
4
FYI le rc.local par défaut a divers commentaires sur le script ne faisant rien et nécessitant des bits exécutables modifiés. Ce n'est pas vrai, entrez simplement la commande de votre script avant l'exit 0 et il s'exécutera au démarrage. Assurez-vous que votre script ferme en arrière-plan ou il bloquera l'invite de connexion. Oui, c'est ce que j'ai fait.
Rob
@rob Voulez-vous dire qu'ils suggèrent que le script soit défini comme exécutable? Ceci est atténué dans la question en exécutant le script avec la commande python myscript.py. Si vous voulez chmod + x et l'ajouter #! /bin/python, vous pouvez exécuter le script en indiquant $pathtofile/myscript.py$pathtofileest .si vous vous trouvez dans le même répertoire ou dans le chemin absolu ou relatif du fichier.
JFA
1
Ce n'est pas bon pour un programme graphique tel qu'un navigateur. /etc/rc.localest uniquement destiné à démarrer les services système (programmes sans interface utilisateur).
Gilles
1
@ ErickM.Sprengel Utilisez l'une des bonnes réponses sur ce fil, tel que celui-ci .
Gilles
32

Ajoutez-le à la crontab

La crontab exécute des commandes à des moments définis.


Editez le fichier:

sudo crontab -e

Ajouter une ligne au fichier (ici un script python):

@reboot python3 /home/pi/Desktop/exemple.py &
Aaron
la source
2
Pour être un peu nerveux ici, techniquement, ce n’est pas crontab qui exécute la commande, mais quoi qu’il en soit. En ce qui concerne la ligne à ajouter, il est conseillé de mettre des chemins complets pour les commandes définies ici (dans ce cas, le chemin complet de python3), voir ici
Ghanima
C'est la méthode que j'ai toujours utilisée pour sa simplicité. +1
Patrick Cook
Ce n'est pas bon pour un programme graphique tel qu'un navigateur. /etc/rc.localest seulement pour démarrer des programmes qui n'ont pas d'interface utilisateur.
Gilles
2
Après avoir passé beaucoup de temps à essayer de le faire fonctionner avec rc.local et init.d et toutes sortes d'autres choses .. cela a fonctionné immédiatement! Merci beaucoup!
Piotr Kula
4
cela ne fonctionne pas pour une raison quelconque dans rpi os
Denis
11

Démarrage automatique des applications xorg

Si le script que vous souhaitez démarrer nécessite une session xorg, essayez de suivre les spécifications de démarrage automatique de freedesktop, qui peuvent ou non fonctionner en fonction de l’environnement de bureau utilisé.

Vous pouvez également cibler votre environnement de bureau spécifique, comme décrit à l' adresse https://wiki.archlinux.org/index.php/autostarting .

Exécuter un script en tant que service systemd

Si votre script correspond à la description d'un démon ou d'un 'service', et que votre système exécute systemd, comme c'est le cas pour raspbian et la plupart des lignes modernes, vous pouvez configurer votre script pour qu'il s'exécute en tant que service systemd. le cycle de vie et l'environnement d'exécution, ainsi que les conditions préalables au (re) démarrage du script, telles que le réseau en cours de fonctionnement. Il est également possible de configurer le redémarrage du service en cas d'échec ( Restart=alwayset le délai entre chaque redémarrage, par exemple RestartSec=10).

Pour une utilisation à l’échelle du système, créez votre fichier d’unité systemd sous /etc/systemd/system, par exemple avec 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

Voir également:

Nous sommes maintenant prêts à tester le service:

systemctl start autossh

Vérification de l'état du service:

systemctl status autossh

Arrêt du service:

systemctl stop autossh

Une fois que vous avez vérifié que le service fonctionne comme prévu, activez-le avec:

systemctl enable autossh

REMARQUE: pour des raisons de sécurité, systemdle script sera exécuté dans un environnement restreint, similaire à celui crontabutilisé pour l' exécution des scripts. Par conséquent, n'émettez aucune hypothèse à propos des variables système préexistantes. Utilisez les Environmentclés si votre script nécessite la définition de variables spécifiques. Ajouter set -xen haut de votre script bash puis le lancer systemctl status my_servicepeut aider à identifier pourquoi votre script échoue. En règle générale, utilisez toujours des chemins absolus pour tout, y compris echoet cat, ou définissez explicitement votre $ PATH.

ccpizza
la source
7

Je veux ajouter mes deux sous, même s’il s’agit d’une question ancienne mais que l’on demande généralement à faire une chose simple: le démarrage automatique. J'ai essayé toutes les solutions suggérées dans toutes les réponses à cette question. Aucun d'entre eux n'a travaillé pour moi. J'utilise Raspberry PI Model 2 avec Raspbian.

Le seul moyen de réussir le démarrage automatique de mon application consiste à utiliser un script, comme suit. Je dis avec succès parce que mon application a démarré comme prévu sans aucun problème, comme démarrer avec un chemin de travail incorrect.

1.Créez un fichier vide avec l'extension .sh et nommez-le comme vous voulez.

2.Copiez et collez EXACTEMENT les éléments suivants sauf que vous remplacez "le nom de votre application" par le nom de script que vous venez de créer.

 #! /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. Enregistrez ensuite le fichier de script dans votre dossier d’application.

  2. Ensuite, ouvrez le /home/pi/.config/autostartdossier. Cela pourrait être différent dans votre cas. Ouvrez simplement votre dossier personnel et activez l’affichage des dossiers cachés. ouvert .config/autostart. Si vous ne voyez pas le dossier de démarrage automatique, créez un dossier appelé démarrage automatique dans le dossier .config.

  3. dans le dossier de démarrage automatique, vous devrez créer un raccourci vers votre fichier de script que vous avez créé comme suit. Créez un fichier vide avec extension .desktop.

  4. Copiez et collez ce qui suit dans le fichier de bureau vide , sauf que vous devrez changer Comment, Name, Exec, Pathet la Iconvaleur du champ.

    [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. Enregistrez et fermez le fichier après avoir modifié tous les champs nécessaires. Vous avez terminé. Juste le tester.

ThN
la source
Techniquement, ce script est exécuté par le système plutôt que par un utilisateur spécifique - alors peut-être que votre application appartient mieux à /usr/local/bin/ApplicationName...?
SlySven
@SlySven "le système" est un utilisateur spécifique.
Expiation limitée
Est-il exécuté en tant que root (UID = 0) ou en tant qu'utilisateur pi (UID ~ 500 ou 1000 IIRC) - s'il est exécuté en tant que root ou qu'un autre UID système (inférieur à 500), il est de tradition de stocker le fichier de script ( ou tout ce dont il dépend) sur le périphérique racine. Ainsi, en cas de problème avec tout autre périphérique (p. ex. homes’il s’agit d’un périphérique distinct), le fichier script (ou un fichier exécutable) n’est pas indisponible lorsque le fichier le système échoue à un /bin/shshell utilisateur unique ! De nos jours systemd, il faut monter les deux /et /usravant que le PID 1 ne soit lancé ...
SlySven 11/12
5

J'ai aussi eu des problèmes avec ça. Voici ce que j'ai fait sur Raspberry Pi3 sous Raspbian:

  1. Créez un script shell de démarrage dans votre répertoire racine (j'ai nommé mine "launch"):

sudo leafpad launch.sh

  1. Sauvegarder le fichier
  2. Editer le fichier de démarrage automatique LXDE-pi

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

  1. Ajoutez ceci au bas de ce fichier

./launch.sh

  1. redémarrer
lamarant
la source
3

Voici ce que j'ai fait sur Raspberry Pi3 sous Raspbian Stretch:

Editer le fichier de démarrage automatique LXDE-pi

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

Ajoutez ceci au bas de ce fichier

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

sauvegarder et redémarrer

Amr Sohil
la source
1

Méthode 1:

Pour lancer automatiquement une commande lors de la connexion, placez-la dans un fichier nommé

.bashrc

dans le répertoire utilisateur (par exemple / home / pi)

.bashrcn'est PAS destiné à exécuter des scripts.

Il est exécuté chaque fois qu'un shell interactif sans connexion est démarré et est utilisé pour configurer le shell.
~/.bashrc: executed by bash(1) for non-login shells.

Par exemple, le fichier pourrait contenir

chromium-browser --kiosk www.google.com

pour lancer Chromium en plein écran, pointez sur www.google.com


Méthode 2:

Cette solution fonctionne vraiment bien. Une fois le navigateur chargé, un petit carré noir apparaît en haut à gauche de l'écran. Il semble s'agir d'un bogue général (mentionné par d'autres sur les forums), mais le mode plein écran masque tout sauf la page du navigateur.

Editez le fichier de démarrage automatique:

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

Mettez tout en commentaire en utilisant un '#' au début de chaque ligne, puis ajoutez les lignes suivantes

Exécuter automatiquement le navigateur

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

Si nécessaire, utilisez l'outil de configuration pour activer l'exécution automatique de l'interface graphique au démarrage

sudo raspi-config

Si vous devez quitter à l'invite de commande CTRL+ ALT+F1

CTRL+ ALT+F2

Utilisateur98764431
la source
0

Vous pouvez placer votre script au bas du /etc/profilefichier.

Les autres options ne fonctionnaient pas pour moi, mais c'est peut-être parce que j'ai placé mon script sur le bureau.

HelpNeeder
la source
0

créez un fichier .sh avec les commandes 'python /path/to/your/script.py' tapez 'sudo nano /etc/rc.local' et tapez le chemin d'accès au fichier .sh

avant

exit 0

Ou vous pouvez simplement taper

crontab -e

ou

sudo crontab -e 

si vous voulez que le script s'exécute au démarrage

à l'intérieur du type de fichier

@reboot python /path/to/your/script.py &
Deepesh
la source
2
L'utilisation de chemins complets est fortement encouragée pour les entrées crontab!
Ghanima
-2

ça marche. (A chaque redémarrage, il prépare automatiquement les soumissions suivantes)

$ 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
YumYumYum
la source
-2

C'est ce que je fais généralement.

  1. Stockez votre fichier dans le répertoire de base de framboise pi. Par exemple: mycode.py
  2. Editez le fichier:

    sudo nano .bashrc

.bashrcn'est PAS destiné à exécuter des scripts.

Il est exécuté chaque fois qu'un shell interactif sans connexion est démarré et est utilisé pour configurer le shell.
~/.bashrc: executed by bash(1) for non-login shells.

  1. Allez à la fin du fichier et écrivez:

    sudo python mycode.py

  2. Si vous souhaitez que la sortie soit stockée dans un fichier txt, modifiez le code à l'étape 3 comme suit:

    sudo python mycode.py >> output.py

J'espère que cela t'aides!

Doe.John
la source