Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/05/2021, à 10:58

Etienne_31000

Autostart de plusieurs programmes, fonctionne mal

Bonjour à tous,

Voilà plusieurs jours que je me casse la tête sur un problème de taille... (à mon niveau, je ne suis pas expert)

J'ai repris un projet qui tourne avec 2 langages différents (Python et C++), et la partie Python est découpée en 2 programmes uniquement compatibles Python 3 et Python 3.7.
J'ai donc :
1 programme C++
1 programme Python 3
1 programme Python 3.7

Je travaille sur une carte embarquée NVIDIA (Jetson Nano) avec Ubuntu 18.04.5 LTS.

Voici mon problème :
Lorsque je veux exécuter mes programmes au démarrage de la carte (mise sous tension) sans moniteur (type écran, clavier souris) de connecté, la carte s'allume, appelle un service géré par systemctl et exécute un .sh qui va à son tour exécuter mes programmes.

Lorsque j'appelle ce même .sh dans une console, après m'être loggé en ssh, tout fonctionne bien, mes programmes n'ont aucun problème. Par contre lorsqu'il est lancé par systemctl au démarrage, voici ce que j'obtiens:

-- L'unité (unit) user@1000.service a terminé son démarrage, avec le résultat RESULT.
mai 06 10:36:32 airoddev avahi-daemon[3799]: Server startup complete. Host name is airoddev-6.local. Local service cookie is 3932533832.
mai 06 10:36:32 airoddev Script_demarrage.sh[4703]: Fin du wait Lancement machine
mai 06 10:36:32 airoddev Script_demarrage.sh[4703]: Lancement du premier process, sleep...
mai 06 10:36:32 airoddev Script_demarrage.sh[4703]: debut main
mai 06 10:36:32 airoddev Script_demarrage.sh[4703]: Nombre de cores : 4
mai 06 10:36:32 airoddev Script_demarrage.sh[4703]: Type de carte : JETSON NANO
mai 06 10:36:32 airoddev Script_demarrage.sh[4703]: Station STATIQUE
mai 06 10:36:32 airoddev Script_demarrage.sh[4703]: *** PAS DE GESTION DEFAUT ***
mai 06 10:36:32 airoddev Script_demarrage.sh[4703]: *** Acquisition Activée ***
mai 06 10:36:32 airoddev Script_demarrage.sh[4703]: *** Inference Activée ***
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]: Traceback (most recent call last):
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:   File "/home/airoddev/inference/acquisition_statique.py", line 41, in <module>
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:     from vimba import *
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:   File "/usr/local/lib/python3.7/dist-packages/vimba/__init__.py", line 103, in <module>
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:     from .vimba import Vimba
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:   File "/usr/local/lib/python3.7/dist-packages/vimba/vimba.py", line 30, in <module>
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:     from .c_binding import call_vimba_c, VIMBA_C_VERSION, VIMBA_IMAGE_TRANSFORM_VERSION, \
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:   File "/usr/local/lib/python3.7/dist-packages/vimba/c_binding/__init__.py", line 107, in <module>
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:     from .vimba_c import VmbInterface, VmbAccessMode, VmbFeatureData, \
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:   File "/usr/local/lib/python3.7/dist-packages/vimba/c_binding/vimba_c.py", line 674, in <module>
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:     _lib_instance = _check_version(_attach_signatures(load_vimba_lib('VimbaC')))
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:   File "/usr/local/lib/python3.7/dist-packages/vimba/c_binding/vimba_common.py", line 484, in load_vimba_lib
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:     return platform_handlers[sys.platform](vimba_project)
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:   File "/usr/local/lib/python3.7/dist-packages/vimba/c_binding/vimba_common.py", line 503, in _load_under_linux
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:     raise VimbaSystemError('No TL detected. Please verify Vimba installation.')
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]: vimba.error.VimbaSystemError: No TL detected. Please verify Vimba installation.
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]: Socket Closed

Je vous mets en dessous mon service systemctl :

[Unit]
Wants = network-online.target
After = network.target network-online.target
Description="Autostart Service"
Environment=/home/airoddev/Vimba_4_2/
PATH=$PATH:/usr/local/bin
DefaultDependencies=false
[Service]
Type=forking
User=airoddev
WorkingDirectory=/home/airoddev/projects/SW_embarque_sexage
ExecStart=/lib/systemd/system/Script_demarrage.sh
Restart=always
[Install]
WantedBy=multi-user.target

Et enfin mon script de démarrage :

#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/airoddev/projects/SW_embarque_sexage:/home/airoddev/inference
echo $(pwd)
echo "Lancement machine"
echo "Attente.... "
sleep 10
echo "Fin du wait Lancement machine "

echo "Lancement du premier process, sleep..."
exec  /home/airoddev/projects/SW_embarque_sexage/a.out &

/usr/bin/python3.7 /home/airoddev/inference/acquisition_statique.py  &
sleep 10
python3 /home/airoddev/inference/inference_2d.py &
sleep 15
echo "Process lancé"

A savoir que j'ai utilisé crontab, systemctl, le dossier rc.local, rien à faire j'ai toujours le même problème...
J'ai cru comprendre dans un premier temps que c'était un problème de permissions mais j'ai bien vérifié que tous les dossiers ont au moins le chmod 755.
En creusant j'ai compris que cette fameuse librairie Vimba qui me dit "No TL detected" serait un problème de config pour choisir entre l'USB et la nappe pour connecter la caméra, mais j'ai bien fait la démarche constructeur (à savoir exécuter un "Install.sh" dans un certain dossier pour configurer le bousin), même problème.
J'en reviens à ce qui me choque le plus : ça fonctionne en manuel mais impossible d'avoir la même chose au démarrage...

Des idées? Je sèche et mes compétences se sont déjà arrêtées il y a bien longtemps sur le sujet

Je vous remercie pour votre aide par avance.

Hors ligne

#2 Le 06/05/2021, à 11:55

kholo

Re : Autostart de plusieurs programmes, fonctionne mal

salut,
avant tout, un peu de lecture :
la doc de systemctl

je ne suis pas très pointu sur les services alors je vais tout analiser... non, non j'ai pas fait de faute ( lol )

je ne m'attarderais pas sur les hérésies que semblent être d'avoir un service et un script de lancement...
mais je vais pointer quelques bricoles pour montrer qu'il serait judicieux de tout reprendre...

PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/airoddev/projects/SW_embarque_sexage:/home/airoddev/inference

est ce bien nécessaire de reprendre tout le PATH là où un

PATH=$PATH:/autre/chemin:/encore/un/autre

serait plus propre et plus simple


toute cette partie ne sert à rien... (le sleep au moins !)

echo $(pwd)
echo "Lancement machine"
echo "Attente.... "
sleep 10
echo "Fin du wait Lancement machine "

il doit manquer une ligne qui a été retirée !


idem les esperluettes simples qui ne font que passer à la ligne d'après pour y mettre un sleep
là où une double esperluette aurait pu valider du bon lancement des scripts les uns après les autres...

echo "Lancement du premier process, sleep..."
exec  /home/airoddev/projects/SW_embarque_sexage/a.out &

/usr/bin/python3.7 /home/airoddev/inference/acquisition_statique.py  &
sleep 10
python3 /home/airoddev/inference/inference_2d.py &
sleep 15

et pour terminer...

echo "Process lancé"

aux vues du code, y a rien de moins sûr !

et pourquoi python 3 ET 3.7 ?
tout avec un minimum de 3.7 est plus logique !?
je serais curieux de voir les deux scripts ou au moins leur shebang...


maintenant...
le service... devrait justement gérer au moins le démarrage voire et l'arrêt ET donner son status.
je vois cette ligne :

ExecStart=/lib/systemd/system/Script_demarrage.sh

c'est lui le fameux script que tu mets ensuite et que je viens de déboulonner
... et que fait ce sh à cet endroit ?
/etc sert à cela !!
voire dans ton dossier où se trouve le programme (/opt) ou /usr


bref...
tes scripts en py appartiennent certainement à ton utilisateur puisque je les vois dans un de ses sous dossiers...

/home/airoddev/inference/...

donc, soit tes scripts retournent à un niveau système (comme je le disais plus haut en les remettant à des endroits plus génériques voire adaptés : /opt, /etc, /usr, ...) et en leur donnant des droits adaptés (souvent root ou user dédié)
soit ton service doit être déclaré comme étant lancé par ton utilisateur... (ce qui va te sembler le plus simple j'en suis sûr !)


donc peut être qu'un petit

User=airoddev

dans ton fichier de service devrait suffire...

puis tu relances le service voire / puis un redémarrage pour voir si tout se lance normalement dans ce cas...

Hors ligne

#3 Le 06/05/2021, à 12:07

sinbad83

Re : Autostart de plusieurs programmes, fonctionne mal

Bonjour,
en relançant un simple grub-install en Live, tout devrait se corriger tout seul avec les paramètres standard.


La connaissance n'est pas une denrée rare, il faut la partager avec les autres.
Linux registered #484707
Site: www.coursinforev.org/doku.php
Desktop AMD Ryzen 5-3600, RAM 16GB, Ubuntu 20.10,   HP Pavillon G6 Ubuntu 20.10 et Ten, Serveur Ubuntu 18.04

Hors ligne

#4 Le 06/05/2021, à 12:40

Etienne_31000

Re : Autostart de plusieurs programmes, fonctionne mal

OK! merci pour vos réponses!

Voici les modifs :
Mon nouveau service, fraichement reloaded

[Unit]
Wants = network-online.target
After = network.target network-online.target
Description="Autostart Service"
Environment=/home/airoddev/Vimba_4_2/
PATH=$PATH:/usr/local/bin
DefaultDependencies=false
[Service]
Type=forking
User=airoddev
WorkingDirectory=/home/airoddev/projects/SW_embarque_sexage
ExecStart=/etc/init.d/Script_demarrage.sh
Restart=always
[Install]
WantedBy=multi-user.target

Ensuite, comme vous pouvez le voir j'ai déplacé mon script de démarrage dans le dossier /etc/init.d

j'ai modifié ce même script en :

#!/bin/bash
PATH=$PATH:/home/airoddev/inference:/home/airoddev/projects/SW_embarque_sexage
sleep 10
echo "Lancement du premier process, sleep..."
exec  /home/airoddev/projects/SW_embarque_sexage/a.out &&

/usr/bin/python3.7 /home/airoddev/inference/acquisition_statique.py  &&
sleep 10
python3 /home/airoddev/inference/inference_2d.py &&
sleep 15
echo "Ordre de lancer les executables envoyé"

Et ensuite j'ai ce nouveau journalctl :

-- L'unité (unit) robot.service a commencé à démarrer.
mai 06 12:31:33 airoddev Script_demarrage.sh[6116]: Lancement du premier process, sleep...
mai 06 12:31:33 airoddev Script_demarrage.sh[6116]: debut main
mai 06 12:31:33 airoddev Script_demarrage.sh[6116]: Nombre de cores : 4
mai 06 12:31:33 airoddev Script_demarrage.sh[6116]: Type de carte : JETSON NANO
mai 06 12:31:33 airoddev Script_demarrage.sh[6116]: Station STATIQUE
mai 06 12:31:33 airoddev Script_demarrage.sh[6116]: *** PAS DE GESTION DEFAUT ***
mai 06 12:31:33 airoddev Script_demarrage.sh[6116]: *** Acquisition Activée ***
mai 06 12:31:33 airoddev Script_demarrage.sh[6116]: *** Inference Activée ***
mai 06 12:31:35 airoddev Script_demarrage.sh[6116]: Socket Closed

Par contre... Les processus que je visualisais via

htop

en python (3 uniquement, le 3.7 ne se lançait pas...) n'apparaissent plus!
Il semblerait que mon script ne parvienne plus à executer la ligne pour lancer les pythons, je n'ai aucune trace dans le terminal qui me dit qu'ils sont lancés.


Pour mon VDD, je ne vois pas le rapport avec Grub? En quoi cela m'aiderait? J'ai besoin que mes programmes se lancent à la mise sous tension de ma carte, juste pour etre bien sur avant d'installer que grub ne me demande pas une manip supplémentaire. Mon système est uniquement sous linux.

Dernière modification par Etienne_31000 (Le 06/05/2021, à 12:44)

Hors ligne

#5 Le 06/05/2021, à 13:59

iznobe

Re : Autostart de plusieurs programmes, fonctionne mal

Bonjour ,

kholo a écrit :

tes scripts en py appartiennent certainement à ton utilisateur puisque je les vois dans un de ses sous dossiers...

/home/airoddev/inference/...

donc, soit tes scripts retournent à un niveau système (comme je le disais plus haut en les remettant à des endroits plus génériques voire adaptés : /opt, /etc, /usr, ...) et en leur donnant des droits adaptés (souvent root ou user dédié)
soit ton service doit être déclaré comme étant lancé par ton utilisateur... (ce qui va te sembler le plus simple j'en suis sûr !)
ET donc peut être qu'un petit

User=airoddev

dans ton fichier de service devrait suffire...

pas les 2 ...

Dernière modification par iznobe (Le 06/05/2021, à 14:00)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

En ligne

#6 Le 06/05/2021, à 16:33

kholo

Re : Autostart de plusieurs programmes, fonctionne mal

mwè...
je ne voudrais pas trop te faire perdre le fil...

ta première version était sale mais fonctionnait...
en tout cas à la main...

juste les && demandent à être sur une ligne...
ils signifient : fait l'instruction d'après si celle d'avant s'est bien terminée
tu peux ajouter un \ pour faire une continuation de ligne
... mais il faut virer les sleep !

echo "Lancement du premier process, sleep..."

exec  /home/airoddev/projects/SW_embarque_sexage/a.out && \
/usr/bin/python3.7 /home/airoddev/inference/acquisition_statique.py  && \
python3 /home/airoddev/inference/inference_2d.py && \
echo "Ordre de lancer les executables envoyé"

et si tu vois "Ordre de lancer les executables envoyé" s'afficher en ligne de commande c'est que toutes les instructions se seront déroulées avec succès...
pour ce qui est de le faire dans un service, cela perd toute utilité puisque le service ne te donnera aucune information par ce biais...
dans un script, tu peux utiliser echo $?

toto@ordi:~$ echo  bonjour
bonjour
toto@ordi:~$ echo $?
0

0 pour son retour indique que l’instruction précédente s'est bien terminée...
et 1 pour dire qu'il y a eu une erreur...

ou tu peux utiliser un fichier de log

fichierlog=/tmp/f_log.log
> $fichierlog
exec  /home/airoddev/projects/SW_embarque_sexage/a.out && echo "SW_embarque_sexage" >> $fichierlog
/usr/bin/python3.7 /home/airoddev/inference/acquisition_statique.py  && echo "acquisition_statique" >> $fichierlog
python3 /home/airoddev/inference/inference_2d.py && echo "inference_2d" >> $fichierlog

si tout se passe bien ton fichier log devra avoir les trois lignes :

cat /tmp/f_log.log
SW_embarque_sexage
acquisition_statique
inference_2d

maintenant il faut voir ce que tu appelles bien se passer... en ligne de commande...
le premier retour via le service que tu avais disait :

mai 06 10:36:34 airoddev Script_demarrage.sh[4703]: Traceback (most recent call last):
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:   File "/home/airoddev/inference/acquisition_statique.py", line 41, in <module>
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:     from vimba import *
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:   File "/usr/local/lib/python3.7/dist-packages/vimba/__init__.py", line 103, in <module>
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:     from .vimba import Vimba
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:   File "/usr/local/lib/python3.7/dist-packages/vimba/vimba.py", line 30, in <module>
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:     from .c_binding import call_vimba_c, VIMBA_C_VERSION, VIMBA_IMAGE_TRANSFORM_VERSION, \
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:   File "/usr/local/lib/python3.7/dist-packages/vimba/c_binding/__init__.py", line 107, in <module>
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:     from .vimba_c import VmbInterface, VmbAccessMode, VmbFeatureData, \
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:   File "/usr/local/lib/python3.7/dist-packages/vimba/c_binding/vimba_c.py", line 674, in <module>
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:     _lib_instance = _check_version(_attach_signatures(load_vimba_lib('VimbaC')))
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:   File "/usr/local/lib/python3.7/dist-packages/vimba/c_binding/vimba_common.py", line 484, in load_vimba_lib
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:     return platform_handlers[sys.platform](vimba_project)
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:   File "/usr/local/lib/python3.7/dist-packages/vimba/c_binding/vimba_common.py", line 503, in _load_under_linux
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]:     raise VimbaSystemError('No TL detected. Please verify Vimba installation.')
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]: vimba.error.VimbaSystemError: No TL detected. Please verify Vimba installation.
mai 06 10:36:34 airoddev Script_demarrage.sh[4703]: Socket Closed

et tu dis que tu voyais tes scripts tourner dans htop...
pour les voir, et nous faire des retours tu peux les chasser avec ps plutôt

et surtout, que se passe t'il si tu lances les scripts py un à un en ligne de commande ?
pas de retour d'erreur concernant les imports ?

par exemple :

File "/home/airoddev/inference/acquisition_statique.py", line 41, in <module>
...
from vimba import *

c'est déjà pas ton import qui merde ?

Hors ligne