Bonjour,
J’ai fait un script python qui se lance automatiquement au démarrage en utilisant systemd.
Pb : lors d’une MAJ du script par SSH, si celui-ci contient une erreur, du style erreur d 'indentation, le redémarrage boucle sans fin et plus d’accès au Raspberry par SSH => obligation de connecter un écran pour corriger. Y a -t-il un moyen d’arrêter cette boucle infinie sans avoir recours à un écran ?
Bonjour,
Malheureusement sans sortir la carte Sd et corriger le script je ne vois pas trop comment faire si le pi est dans une boucle de démarrage.
En effet, les scripts au démarrage démarre avant et pendant la mise en réseau, impossible donc d’intervenir avec le SSH si le boot ne se termine pas.
Si tu as un boot loop, c’est que ton script doit demander la fermeture ou le redémarrage du système. En cas de « fail », il va plutot soit s’arrêter (et attendre) soit continuer.
Dans le cas de problème système, tel que le problème de chargement d’une partition ou d’un module système, il devrait entrer en mode « panic » et donner un accès root sans montage du système de fichier, il faudra alors faire le montage manuellement pour accéder au système, corriger le script et relancer.
Mais tout problème dans le boot demande une intervention physique (retrait de la carte SD ou accès clavier/écran). Impossible de le faire en réseau.
Dans certaines distribution linux, le fait d’appuyer sur SHIFTH permet de bypass le démarrage du service au moment d’appuyer. Ceci est rare et vaut quand même le coup d’essayer.
j’ai écrit la ligne :
Restart=on-failure
dans /etc/systemd/system/myboot-service.service
c’est pour ça qu’il reboote en boucle.
Mais je crois que je suis obligé de la mettre car il se peut qu’il échoue car le Rpi0W est lent à charger le réseau.
En pratique je commente la ligne :
Execstart= usr/bin/python mon_programme.py
dans ce même fichier pour tester le script python et quand il fonctionne correctement je remets la ligne.
C’est pour ça que j’opte plus pour un démarrage avec Cron, car il démarre après le réseau. Mais tu peux aussi définir le démarrage APRÈS le réseau (network.target je crois de mémoire…).
Tu peux aussi démarrer en service et ajouter un cron périodique ou à un délais retardé, qui vérifie si le processus est exécuté, si non, il le démarre (un « backup » de démarrage, genre).