Lancer un script au boot du Raspberry Pi

Il arrive que lors de la création d’un serveur, on souhaite exécuter certains programmes dès le démarrage de l’OS. Voici comment faire sous Raspbian.

76c171b2-de28-f1d9-f84a-ff0c977d55d3

Lorsque vous installer un outil, généralement celui-ci va vous fournir le(s) script(s) pour être exécuté dès le démarrage de la machine. C’est le cas de Nginx, php-fpm, apache, mysql, etc.

Avant tout, le script

Mais si vous voulez faire un script vous même ou alors que l’outil est multi plateforme, ça se complique. Par exemple, si vous installez un serveur Minecraft (merci Pierre pour l’idée d’article 🙂 ).

Vous devez créer un fichier dans le répertoire /etc/init.d. Ce fichier XYZ aura comme contenu de base :

#!/bin/bash

# Apres cette ligne les commandes seront executees systematiquement

# ...

# Apres cette ligne les commandes executees en fonction du parametre passe en ligne de commande

case "$1" in

    start)

        # Commandes executees avec le parametre start (celui lors du boot)

        ;;

    stop)

        # Commandes executees avec le parametre stop (celui lors de l'arret du systeme)

        ;;

    reload|restart)

        $0 stop

        $0 start

        ;;

    *)

        echo "Usage: $0 start|stop|restart|reload"

        exit 1

esac

exit 0

N’oubliez pas de rendre le script exécutable avec la commande chmod :

chmod 755 /etc/init.d/XYZ

Vous pouvez ensuite tester votre script avec la commande service. Vous passez en paramètre l’argument que vous souhaitez. Par exemple pour démarrer votre service :

service XYZ start

Activer le script

Si ça fonctionne comme vous voulez, vous pouvez alors activer le lancement du script au démarrage du système avec la commande update-rc.d :

update-rc.d XYZ defaults

Cette commande ajoute le script dans la séquence de démarrage de votre Raspberry. Vous pouvez utiliser d’autres valeurs à la place de defaults :

  • remove : pour supprimer le script de la séquence de démarrage
  • disable : pour désactiver le script
  • enable : pour activer le script

D’autres paramètres permettent de régler la séquence de démarrage et les priorités du scripts en modifiant la configuration LSB (plus d’infos dans ce post).

Oui mais si je dois interagir avec mon service ?

Vous avez maintenant toutes les informations pour pouvoir créer vous même un service qui se lance au démarrage de votre Raspberry. Toutefois, il y a une situation particulière qui peut poser problème : comment faire si mon programme ne rend pas la main et est intéractif ?

La commande magique c’est screen. Cette commande va vous permettre de lancer une commande en la détachant de votre terminal mais de pouvoir continuer à interagir avec cette commande.

Par exemple :

screen -dmS ma_session /chemin/vers/mon/script

Cette commande va lancer le script dans une session appelée ma_session. Le programme s’exécute et fonctionne normalement mais en arrière plan.

Pour interagir avec vous pouvez toujours utiliser la commande screen :

screen -p 0 -S ma_session -X eval 'stuff "ma_commande_a_executer"15'

En activant la fenêtre par défaut de l’application attachée à ma_session, je demande d’exécuter la commande ma_commande_a_executer. Cette commande pourrait être mise dans le script XYZ (dans /etc/init.d) avec un paramètre particulier, par exemple do_my_cmd et sera alors invoquée avec :

service XYZ do_my_cmd

Voilà, j’espère que cet article vous aura donné des informations et pistes pour faire vos propres services. N’hésitez pas à partager vos expériences dans ce domaine technique (ou corriger des erreurs qui se seraient glissées).

Vous aimerez peut être aussi...

  • blop

    Personnellement, je suis allé au plus simple:

    J’ai un script python GPIO qui active un relay à périodiquement; Je le lance au boot avec crontab:

    nano /etc/cron.d/relay :

    @reboot root /root/relay.py

    Comme il est dit dans l’article, ne pas oublier de rendre votre script éxécutable.

    Dans linux, un systeme de mail interne est installé. Pour ne pas risquer de remplir la boite mail de root et remplir le disque, on peut rediriger la sortie vers /dev/null:

    @reboot root /root/relay.py 2>&1 >/dev/null

  • Simon

    Bonjour,

    Dans start j’aimerais lancer un programme exécutable écrit en C/C++ qui interagi avec les gpio.
    j’ai donc grossièrement essayer sa (j’ai volontairement raccourci le script) :
    start)

    # Commandes executees avec le parametre start (celui lors du boot)
    sudo ./home/pi/prog/programme.c

    l’erreur envoyer est la suivante :
    sudo: ./home/pi/prog/programme.c: command not found

    je n’arrive pas a trouver la solution sur internet, pourriez vous me mettre sur la voie ?

    • Le fichier n’existe pas ou n est pas exécutable. C’est le nom du fichier résultat de la compilation qu’il faut mettre et non le nom du fichier source.
      En espérant que ça aide.

    • moi

      même un ./appli.exe je suis pas sûr qu’il apprécie, car comment peut tu être sûr du répertoire dans lequel tu te trouves ?

      tente plutôt
      $ sudo /home/pi/appli.exe

      ps : oui je sais pour linux on est pas obligé de mettre des .exe mais c’est plus pratique pour les nommer ^^
      (comme quoi Windows ne fait pas que des bêtises )

  • liberodark

    Bonjour,

    Je voudrais faire un script pour tightvnc !

    Voici mon script :

    #!/bin/bash

    case « $1 » in
    start)
    tightvncserver
    ,,
    esac

  • Horloge

    Bonjour 🙂

    Je voudrais exécuter un Script au démarrage qui me définie une fois pour toutes mes Pins GPIO:
    http://blog.idleman.fr/raspberry-pi-06-utiliser-le-gpio-et-interagir-avec-le-monde-reel/

    Je suis tous ce que tu dis, mais lors du démarrage, on dirait que le script ne s’exécute pas; mes Pins ne sont pas définies…
    Par contre, si je fais la commande de service … start, ça marche…

    Voilà mon Script: http://pastebin.com/5BJaLqqk

    Merci.

    • Bonjour
      Est-ce que la commande update-rc.d

      • Horloge

        ?
        Je crois que ton message a été coupé :O

        Je pense avoir peut-être trouvé la solution, c’est une histoire de Variable Globale du système.
        Mes « gpio mode X out » définissent bien les Sorties au démarrage, mais pas dans ma Session, ce qui m’empêche d’utiliser les « gpio write X X » correctement, vu que les définitions sont « un cran plus haut ».

        J’essaierai de manipuler les variables d’environnement, je te dirai.

        Merci.