Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

udev again

35 réponses
Avatar
Pascal
Bonjour,
je reviens avec mes soucis de udev.

J'ai créé une règle udev qui au branchement d'une montre garmin lance un
script

Ce script lance une application (graphique) permettant la gestion des
courses sur ce type de montre.

La règle fonctionne a peu pret bien.
Je m'explique

Normalement à l'insertion d'un périphérique usb celui-ci est vmonté
automatiquement sans que je m'occupe de quoi que ce soit.

Dans mon cas de figure ça ne fonctionne pas vraiment lors du branchement
de la montre la règle est bien exécutée, l'application se lance mais je
dois attendre un gros moment avant que la montre soit montée.
Ce qui n'est pas le cas si j'enlève la règle

La règle :
SUBSYSTEM=="usb", ATTR{idVendor}=="091e",
ATTR{idProduct}=="25ca",RUN+="/bin/su pascal -c
'/home/pascal/Desktop/udev-turtlesport.sh'"

le script
#!/bin/bash
export DISPLAY=":0.0"
/usr/bin/turtlesport &


Une idée pour faire en sorte que ma règle soit exécutée après le montage ?

d'avance merci

10 réponses

1 2 3 4
Avatar
Francois Lafont
Bonjour,

Le 01/12/2012 16:00, Pascal a écrit :

Une idée pour faire en sorte que ma règle soit exécutée après le montage ?



Ça ne répond pas directement à la question, mais peut-être qu'une
solution serait de lancer le script mais, dans le script, attendre que
le périphérique soit monté ? Évidemment il faut trouver un moyen de
tester si le périphérique est bien monté. Je ne sais pas s'il y une
manière propre et standard de faire ça, mais en supposant qu'il est
toujours monté dans le répertoire /media/garmin, le script pourrait
peut-être être un truc comme ça :

-----------------------------------------
#!/bin/bash

# On veut que le script rende la main tout de suite.
{
c=0

# On attend que le périphérique soit monté.
while ! mountpoint /media/garmin; do
sleep 0.5
c=$((c+1))
# Au bout d'un certain temps on abandonne.
if [ "$c" = 20 ]; then
exit 1
fi
done

export DISPLAY=":0.0"
/usr/bin/turtlesport &

} &
-----------------------------------------

Bon, rien n'est testé...


--
François Lafont
Avatar
Francois Lafont
Le 01/12/2012 16:34, Francois Lafont a écrit :

Évidemment il faut trouver un moyen de
tester si le périphérique est bien monté. Je ne sais pas s'il y a une
manière propre et standard de faire ça



Et si connaissez une manière propre et standard de faire ça, ça
m'intéresse fichtrement. ;-)

--
François Lafont
Avatar
geo cherchetout
Le 01/12/2012 16:39, *Francois Lafont* a écrit fort à propos :

Évidemment il faut trouver un moyen de
tester si le périphérique est bien monté. Je ne sais pas s'il y a une
manière propre et standard de faire ça



Et si connaissez une manière propre et standard de faire ça, ça
m'intéresse fichtrement. ;-)



Peut-être avec la commande mountpoint ?
Avatar
Francois Lafont
Le 01/12/2012 17:46, geo cherchetout a écrit :

Évidemment il faut trouver un moyen de
tester si le périphérique est bien monté. Je ne sais pas s'il y a une
manière propre et standard de faire ça



Et si connaissez une manière propre et standard de faire ça, ça
m'intéresse fichtrement. ;-)



Peut-être avec la commande mountpoint ?



Mais c'est ce que j'utilise justement dans le petit script que j'ai
laissé en exemple dans le message précédent. Simplement, cela a
l'inconvénient d'être obligé de connaître à l'avance le point de montage.

--
François Lafont
Avatar
Pascal
Le 01/12/2012 18:30, Francois Lafont a écrit :
Le 01/12/2012 17:46, geo cherchetout a écrit :

Évidemment il faut trouver un moyen de
tester si le périphérique est bien monté. Je ne sais pas s'il y a une
manière propre et standard de faire ça



Et si connaissez une manière propre et standard de faire ça, ça
m'intéresse fichtrement. ;-)



Peut-être avec la commande mountpoint ?



Mais c'est ce que j'utilise justement dans le petit script que j'ai
laissé en exemple dans le message précédent. Simplement, cela a
l'inconvénient d'être obligé de connaître à l'avance le point de montage.



mais du coup comment ça se passe avec l'automount effectué automatiquement ?
Avatar
geo cherchetout
Le 01/12/2012 18:30, *Francois Lafont* a écrit fort à propos :
Le 01/12/2012 17:46, geo cherchetout a écrit :

Peut-être avec la commande mountpoint ?



Mais c'est ce que j'utilise justement dans le petit script que j'ai
laissé en exemple dans le message précédent. Simplement, cela a
l'inconvénient d'être obligé de connaître à l'avance le point de montage.



Oups, désolé, j'avais à peine survolé ton script. Un bon moyen de connaître
le point de montage, c'est de l'imposer, non ?
Avatar
Pascal
Le 01/12/2012 16:34, Francois Lafont a écrit :
Bonjour,

Le 01/12/2012 16:00, Pascal a écrit :

Une idée pour faire en sorte que ma règle soit exécutée après le montage ?



Ça ne répond pas directement à la question, mais peut-être qu'une
solution serait de lancer le script mais, dans le script, attendre que
le périphérique soit monté ? Évidemment il faut trouver un moyen de
tester si le périphérique est bien monté. Je ne sais pas s'il y une
manière propre et standard de faire ça, mais en supposant qu'il est
toujours monté dans le répertoire /media/garmin, le script pourrait
peut-être être un truc comme ça :

-----------------------------------------
#!/bin/bash

# On veut que le script rende la main tout de suite.
{
c=0

# On attend que le périphérique soit monté.
while ! mountpoint /media/garmin; do
sleep 0.5
c=$((c+1))
# Au bout d'un certain temps on abandonne.
if [ "$c" = 20 ]; then
exit 1
fi
done

export DISPLAY=":0.0"
/usr/bin/turtlesport&

}&
-----------------------------------------

Bon, rien n'est testé...




j'avais tenté ça en mettant juste un sleep avant mes commandes mais ça
ne marcbhait pas.
En fait on dirait que c'est la règle elle même qui "empêche " le montage

Hmm pas sur d'être très clair.
En fait la règle est bien respectée c'est à dire qu'avant même que la
montre soit montée, l'application se lance, si je ne fais rien dans le
syslog je vois un timeout puis le disque se monte.Et si je quitte
l'application le disque se monte immédiatement après
Pourtant j'ai appelé ma règle 99...... en pensant qu'elle serait la
dernière à être executée mais rien n'y fait
Avatar
Francois Lafont
Le 01/12/2012 19:46, Pascal a écrit :

Mais c'est ce que j'utilise justement dans le petit script que j'ai
laissé en exemple dans le message précédent. Simplement, cela a
l'inconvénient d'être obligé de connaître à l'avance le point de montage.



mais du coup comment ça se passe avec l'automount effectué
automatiquement ?



Heu, désolé je ne sais pas. Je vois pas trop ce que tu veux dire. Tout
ce que je peux te dire c'est qu'empiriquement j'ai pu constater que mes
clés USB se montaient systématiquement au même endroit et que donc en
pratique connaître à l'avance le point de montage n'était pas un souci.

Mais c'est juste empirique...


--
François Lafont
Avatar
Francois Lafont
Le 01/12/2012 20:55, Pascal a écrit :

j'avais tenté ça en mettant juste un sleep avant mes commandes mais ça
ne marcbhait pas.
En fait on dirait que c'est la règle elle même qui "empêche " le montage



Oui et donc c'est pour ça quand dans le script à 2 centimes que je t'ai
mis dans mon premier message j'ai fait en sorte que le script rende la
main immédiatemment (via la structure { ... } &). Tu l'as testé pour
voir ? Ça donne quoi ?

Si on part du principe que tant que la règle n'a pas été appliquée et
qu'elle n'est pas « achevée » la clé ne se monte pas, alors
effectivement un truc comme ça ne marchera pas :

-----------------------------------------
#!/bin/bash
sleep 5

export DISPLAY=":0.0"
/usr/bin/turtlesport &
-----------------------------------------

car de toute façon la commande tutlesport sera lancée avant que la règle
ne s'achève, puisque la règle attend d'abord la fin du script, et donc
avant le montage de la clé.

Mais si tu regardes bien le script de mon premier message, j'ai mis ça :

-----------------------------------------
#!/bin/bash
{
# on attend le montage.
# Ensuite on lance la commande
} &
-----------------------------------------

Et la structure « { ... } & » fait que le script lancé par la règle
rendra la main immédiatement sans attendre la fin de son exécution. Donc
la règle sera terminée immédiatement (la règle aura seulement lancé le
script sans attendre qu'il se termine). Le script lui continuera tout
seul dans son coin son exécution *en* *arrière* *plan* mais la règle,
elle, sera bien appliquée et « achevée » et le mécanisme udev passera à
la suite. Et dans l'exécution du script, il y a une partie au début qui
fait en sorte d'attendre le montage de la clé avant de lancer turtlesport.

En résumé, l'idée est : puisque que la règle doit se terminer pour que
le montage ait lieu, alors il faut que la règle lance le script en
arrière plan.

Hmm pas sur d'être très clair.
En fait la règle est bien respectée c'est à dire qu'avant même que la
montre soit montée, l'application se lance, si je ne fais rien dans le
syslog je vois un timeout puis le disque se monte.Et si je quitte
l'application le disque se monte immédiatement après
Pourtant j'ai appelé ma règle 99...... en pensant qu'elle serait la
dernière à être executée mais rien n'y fait



Si j'ai bien compris tout ça. Mais alors, c'est peut-être moi qui ne
suis pas clair. J'espère qu'avec les lignes ci-dessus, ça l'ai un peu
plus. Non ?

--
François Lafont
Avatar
Pascal
Le 01/12/2012 22:13, Francois Lafont a écrit :
Le 01/12/2012 20:55, Pascal a écrit :

j'avais tenté ça en mettant juste un sleep avant mes commandes mais ça
ne marcbhait pas.
En fait on dirait que c'est la règle elle même qui "empêche " le montage



Oui et donc c'est pour ça quand dans le script à 2 centimes que je t'ai
mis dans mon premier message j'ai fait en sorte que le script rende la
main immédiatemment (via la structure { ... }&). Tu l'as testé pour
voir ? Ça donne quoi ?

Si on part du principe que tant que la règle n'a pas été appliquée et
qu'elle n'est pas « achevée » la clé ne se monte pas, alors
effectivement un truc comme ça ne marchera pas :

-----------------------------------------
#!/bin/bash
sleep 5

export DISPLAY=":0.0"
/usr/bin/turtlesport&
-----------------------------------------

car de toute façon la commande tutlesport sera lancée avant que la règle
ne s'achève, puisque la règle attend d'abord la fin du script, et donc
avant le montage de la clé.

Mais si tu regardes bien le script de mon premier message, j'ai mis ça :

-----------------------------------------
#!/bin/bash
{
# on attend le montage.
# Ensuite on lance la commande
}&
-----------------------------------------

Et la structure « { ... }& » fait que le script lancé par la règle
rendra la main immédiatement sans attendre la fin de son exécution. Donc
la règle sera terminée immédiatement (la règle aura seulement lancé le
script sans attendre qu'il se termine). Le script lui continuera tout
seul dans son coin son exécution *en* *arrière* *plan* mais la règle,
elle, sera bien appliquée et « achevée » et le mécanisme udev passera à
la suite. Et dans l'exécution du script, il y a une partie au début qui
fait en sorte d'attendre le montage de la clé avant de lancer turtlesport.

En résumé, l'idée est : puisque que la règle doit se terminer pour que
le montage ait lieu, alors il faut que la règle lance le script en
arrière plan.

Hmm pas sur d'être très clair.
En fait la règle est bien respectée c'est à dire qu'avant même que la
montre soit montée, l'application se lance, si je ne fais rien dans le
syslog je vois un timeout puis le disque se monte.Et si je quitte
l'application le disque se monte immédiatement après
Pourtant j'ai appelé ma règle 99...... en pensant qu'elle serait la
dernière à être executée mais rien n'y fait



Si j'ai bien compris tout ça. Mais alors, c'est peut-être moi qui ne
suis pas clair. J'espère qu'avec les lignes ci-dessus, ça l'ai un peu
plus. Non ?



Tu es limpide !!
C'est juste le script que je ne comprend pas tout à fait
J'ai du mal à piger la différence avec ma règle à laquelle j'ai mis
entre autre & après le script
Mais je vais essayer et je te tiens au courant

Merci
1 2 3 4