Page 1 sur 3

Démarrer un service lorsque un périphérique est prêt

Posté : dim. 5 févr. 2023 00:15
par piper
Bonjour,
Petit problème très technique qui dépasse mes compétences (moi je connais plus le soft que le hard)
Voilà, j'ai un périphérique USB branché sur mon PI.
Le matériel est reconnu
Le pilote est installé
Le programme qui exploite se périphérique fonctionne.
C'est un programme écrit en C mais peu importe, là n'est pas la question.

Je souhaite que ce programme démarre automatiquement au boot (et je veux un truc propre : pas de contab ou de rc.local, d'ailleurs j'ai même essayé : c'est pareil,
Ayant l'habitude de systemd, je créé donc un fichier qui décrit le service, je l'active et le lance : tout est ok jusque là

Je reboote et le service n'est pas démarré.
Je regarde pourquoi avec journalctl.

Là, on me dit que le port usb n'était pas prêt lors du démarrage du service

Quelqu'un sait comment utiliser After ou une autre propriété pour que le service ne démarre qu'une fois les ports usb prêts ?
Je sais l'utiliser si un service soft dépend d'un autre mais là ....

J'ai trouvé ceci mais cela ne fonctionne pas :
https://superuser.com/questions/1322777 ... b-is-ready

Ah, pour info, si je fais un truc ignoble dans rc.local (sleep 15 ; lancement du programme) ça fonctionne !
Donc ça prouve bien qu'il faut juste que le programme démarre après un autre

Merci

Re: Démarrer un service lorsque un périphérique est prêt

Posté : lun. 6 févr. 2023 13:25
par dyox
Bonjour piper,

Peut-être mettre en place un timer dans le fichier de conf du daemon ou de mettre "ExecStartPre=/bin/sleep 15" ?

Je n'ai pas vu d'autres idées.

J'avais pensé après le dernier service lancé par systemd (systemd-analyze blame) mais chez moi cela est de 2~3s donc pas suffisant.

Re: Démarrer un service lorsque un périphérique est prêt

Posté : lun. 6 févr. 2023 15:43
par jelopo
Bonjour,

Avec la commande

Code : Tout sélectionner

$ sudo dmesg | grep -i USB
on devrait visualiser quand le module USB est actif.

Cela peut aider à voir ce qui est démarré juste avant et de mieux gérer le temps d'attente avant démarrage.

Une autre approche à tester serait d'utiliser le principe d'un automount USB. Par contre si ce n'est pas un disque ou une clé USB, il va falloir probablement bidouiller. L'avantage, serait que le matériel USB pourrait être inséré n'importe quand après le boot.

https://unix.stackexchange.com/question ... nux-debian

A+

Re: Démarrer un service lorsque un périphérique est prêt

Posté : lun. 6 févr. 2023 16:11
par piper
Bonjour.
Le sleep ??
Déjà essayé : le but, m'assurer que c'est bien parce que le périphérique n'est pas encore prêt.
Ca fonctionne mais je ne pas laisser ça ! Dans le genre moche, j'ai rarement vu pire. C'est juste bon à valider une hypothèse (chose faite immédiatement)

dmesg dit ceci :
[ 0.236440] usbcore: registered new interface driver usbfs (1ère ligne)
---
---
---
---
---
et enfin
[ 32.952226] rc rc0: Realtek RTL2832U reference design as /devices/platform/soc/20980000.usb/usb1/1-1/1-1.2/rc/rc0
[ 32.952675] rc rc0: lirc_dev: driver dvb_usb_rtl28xxu registered at minor = 0, raw IR receiver, no transmitter
[ 32.953079] input: Realtek RTL2832U reference design as /devices/platform/soc/20980000.usb/usb1/1-1/1-1.2/rc/rc0/input0
[ 33.178705] usb 1-1.2: dvb_usb_v2: schedule remote query interval to 200 msecs
[ 33.246038] usb 1-1.2: dvb_usb_v2: 'Realtek RTL2832U reference design' successfully initialized and connected
[ 33.246515] usbcore: registered new interface driver dvb_usb_rtl28xxu
[ 38.608362] dvb_usb_v2: 'Realtek RTL2832U reference design:1-1.2' successfully deinitialized and disconnected (avant dernière ligne)

<<< C'est lui que j'attends
Pb : il pourrait être sur usb 1-1.1 ou usb 1-1.2 ou usb 1-1.3 ou usb 1-1.4 : il y a 4 ports USB
(Bizarre le message "disconnected")

Avec systemd et ses variables de dépendances, il doit bien y avoir un truc possible.
La dépendance avec le soft est documentée mais par rapport au hard : google reste muet.

Re: Démarrer un service lorsque un périphérique est prêt

Posté : mar. 7 févr. 2023 10:20
par jelopo
Bonjour,

Avez-vous essayer de créer une règle udev ? (Rechercher udev rules)
https://doc.ubuntu-fr.org/udev
https://linuxconfig.org/tutorial-on-how ... s-in-linux

Je crois comprendre que ces règles peuvent juste définir un nouveau périphérique ou bien en plus lancer un programme ?

Pour aller plus loin en passant par systemd, il es possible de démarrer des services avec une règle [Unit] after dans systemd.
avec pour condition une "target" qu'il faut créer...

Qqs pistes à explorer
https://superuser.com/questions/1322777 ... b-is-ready
https://unix.stackexchange.com/question ... md-service

Bonne bidouilles.

A+

Re: Démarrer un service lorsque un périphérique est prêt

Posté : mar. 7 févr. 2023 10:40
par piper
Bonjour, merci
Oui, mon idée de départ est d'utiliser systemd puisque c'est le gestionnaire de service de bullseye
En exploitant ses options (After, Target)

Sauf que je n'ai aucune connaissance en udev
Mais grâce à vos liens (je n'avais pas trouvé ceux là), peut-être bien qu'une lecture approfondie me donnera la solution.
En tout cas, ça fait un bon TP à faire à la maison quand le dimanche il faut moche dehors.

Merci

Re: Démarrer un service lorsque un périphérique est prêt

Posté : mar. 7 févr. 2023 11:14
par destroyedlolo
Coucou,

Je ne doute pas que tu partageras tes trouvailles ;)

J'ai le même problème avec un soft qui fait clignoter les LED "RJ45" en fonction de la charge CPU sur mes bananes : il crashe sur celui sous ARMBian car, visiblement, le device MII/MDIO n'est pas accessible immédiatement après que le réseau est lancé.

A+

Re: Démarrer un service lorsque un périphérique est prêt

Posté : mar. 7 févr. 2023 23:13
par piper
1ère étape, lire la doc et se faire des expériences car rien de vaut la véritable pratique pour comprendre.
Ensuite, application à mon problème particulier, vérifications
Enfin, explication sur comment j'ai fait

Re: Démarrer un service lorsque un périphérique est prêt

Posté : jeu. 9 févr. 2023 09:08
par jelopo
Bonjour,

Bon RTFM :geek:

A+

Re: Démarrer un service lorsque un périphérique est prêt

Posté : jeu. 9 févr. 2023 11:10
par piper
C'est ma signature en bas des programmes que j'écris : RTFM :mrgreen: