OVH Cloud OVH Cloud

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
Salut,

Le 03/12/2012 16:36, Pascal a écrit :

j'ai fait la manip de françois sans succès.
Je suis censé refaire un test "from scratch" pour être bien sur que ça ne
fonctionne pas.
Là, comme je l'expliquais, j'ai la nette impression que ma règle empêche le
montage de ma "clé" (montre garmin vue comme un disque usb)



Mais je crois que ce que te propose Lucas c'est de tenter la manip avec
une bonne vieille clé USB des familles (pas avec ta montre Garmin). Chez
moi, ça avait fonctionné impeccable. Mais bon... on n'est pas sur le
même système.

--
François Lafont
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'ai donc fait les tests avec la montre et avec une clé usb
dans les deux cas ça ne fonctionne pas.
J'ai essayé avec 2 scripts différents, un qui lance mon appli graphique
un autre qui comme tu le proposes écrit dans un fichier en fonction du
résultat.
Pas mieux
en fait la règle lance le script qui ne rend visiblement pas la main.
Et au bout d'un certain temps (timeout dixit syslog) lance le montage du
disque

je vois pas trop ce qui ne va pas
snirf

merci pour ton aide en tout cas
Avatar
Francois Lafont
Bonjour,

Le 09/12/2012 10:19, Pascal a écrit :

J'ai donc fait les tests avec la montre et avec une clé usb
dans les deux cas ça ne fonctionne pas.
J'ai essayé avec 2 scripts différents, un qui lance mon appli graphique
un autre qui comme tu le proposes écrit dans un fichier en fonction du
résultat.
Pas mieux
en fait la règle lance le script qui ne rend visiblement pas la main.



Vraiment, je ne vois pas. Le « & » à la fin du script est justement fait
pour que le script rende la main immédiatement.

Question bête : si tu lances le script toi-même à la main dans un
terminal, est-ce que celui-ci te rend la main immédiatement ?

Et au bout d'un certain temps (timeout dixit syslog) lance le montage du
disque

je vois pas trop ce qui ne va pas
snirf

merci pour ton aide en tout cas



Pas de quoi, mais hélas force est de constater que ça n'a pas été très
efficace.

--
François Lafont
Avatar
Michel Campfort
Le 09.12.2012 10:19, Pascal a écrit :
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'ai donc fait les tests avec la montre et avec une clé usb
dans les deux cas ça ne fonctionne pas.
J'ai essayé avec 2 scripts différents, un qui lance mon appli graphique
un autre qui comme tu le proposes écrit dans un fichier en fonction du
résultat.
Pas mieux
en fait la règle lance le script qui ne rend visiblement pas la main.
Et au bout d'un certain temps (timeout dixit syslog) lance le montage du
disque

je vois pas trop ce qui ne va pas
snirf

merci pour ton aide en tout cas




Lorsque tu essaie avec ta clé, le mountpoint doit être différent de
/media/garmin.
Avatar
Pascal
Le 09/12/2012 11:49, Michel Campfort a écrit :
Le 09.12.2012 10:19, Pascal a écrit :
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'ai donc fait les tests avec la montre et avec une clé usb
dans les deux cas ça ne fonctionne pas.
J'ai essayé avec 2 scripts différents, un qui lance mon appli graphique
un autre qui comme tu le proposes écrit dans un fichier en fonction du
résultat.
Pas mieux
en fait la règle lance le script qui ne rend visiblement pas la main.
Et au bout d'un certain temps (timeout dixit syslog) lance le montage du
disque

je vois pas trop ce qui ne va pas
snirf

merci pour ton aide en tout cas




Lorsque tu essaie avec ta clé, le mountpoint doit être différent de
/media/garmin.



Quand j'ai fait les tests avec la clé j'ai modifié règle et script bien sur
Avatar
Pascal
Le 09/12/2012 11:20, Francois Lafont a écrit :
Bonjour,

Le 09/12/2012 10:19, Pascal a écrit :

J'ai donc fait les tests avec la montre et avec une clé usb
dans les deux cas ça ne fonctionne pas.
J'ai essayé avec 2 scripts différents, un qui lance mon appli graphique
un autre qui comme tu le proposes écrit dans un fichier en fonction du
résultat.
Pas mieux
en fait la règle lance le script qui ne rend visiblement pas la main.



Vraiment, je ne vois pas. Le «& » à la fin du script est justement fait
pour que le script rende la main immédiatement.

Question bête : si tu lances le script toi-même à la main dans un
terminal, est-ce que celui-ci te rend la main immédiatement ?


Et bien on en fait!!
le script lance l'application mais pour récupérer l'invite je dois
appuyer une fois sur la touche entrée que turtlesport tourne encore ou
pas d'ailleurs
est ce une piste ?




Et au bout d'un certain temps (timeout dixit syslog) lance le montage du
disque

je vois pas trop ce qui ne va pas
snirf

merci pour ton aide en tout cas



Pas de quoi, mais hélas force est de constater que ça n'a pas été très
efficace.



Merci encore
Avatar
Francois Lafont
Le 09/12/2012 14:32, Pascal a écrit :

Question bête : si tu lances le script toi-même à la main dans un
terminal, est-ce que celui-ci te rend la main immédiatement ?


Et bien on en fait!!



Sans blague...?

le script lance l'application mais pour récupérer l'invite je dois
appuyer une fois sur la touche entrée que turtlesport tourne encore ou
pas d'ailleurs
est ce une piste ?



Ben oui, c'est une piste. On va revenir aux fondamentaux.

1. Si tu testes en ligne de commandes le script suivant (tu adaptes les
chemins en fonction de ton environnement) :

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

{
sleep 20
echo "Hello" > /home/pascal/Bureau/hello.txt
} &
------------------------------------------

On est bien d'accord que le script te rend la main instantanément ? Et
qu'accessoirement au bout de 20 secondes le fichier hello.txt est créé
sur ton bureau ?

2. Tu peux nous faire un copié-collé *verbatim* de ton script avec
turtlesport ?

--
François Lafont
Avatar
Pascal
1. Si tu testes en ligne de commandes le script suivant (tu adaptes les
chemins en fonction de ton environnement) :

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

{
sleep 20
echo "Hello"> /home/pascal/Bureau/hello.txt
}&
------------------------------------------

On est bien d'accord que le script te rend la main instantanément ? Et
qu'accessoirement au bout de 20 secondes le fichier hello.txt est créé
sur ton bureau ?


On est d'accord


2. Tu peux nous faire un copié-collé *verbatim* de ton script avec
turtlesport ?



Il s'agit de ton script dans lequel j'ai modifié le nom du dossier :

#!/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 &

} &
Avatar
Francois Lafont
Le 09/12/2012 19:00, Pascal a écrit :

2. Tu peux nous faire un copié-collé *verbatim* de ton script avec
turtlesport ?



Il s'agit de ton script dans lequel j'ai modifié le nom du dossier :

#!/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 et bien chez moi ce script me rend bien la main immédiatement. Tu
est sûr que ce n'est pas le cas chez toi ? Attention, car on peut avoir
une fausse impression à cause des échecs successifs de la commande
mountpoint où l'on se retrouve avec plein de messages qui polluent la
console.

Essaye le script ci-dessous (c'est le même sauf que j'ai ajouté l'option
-q qui rend la commande mountpoint silencieuse) :

----------------------------------------------
#!/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 -q /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 &

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

Fais une tentative directement en ligne de commandes 1) alors que la clé
n'est pas montée et 2) quand la clé est montée.

Dans les deux cas, le script te rend bien la main immédiatement, non ?

--
François Lafont
Avatar
Pascal
Essaye le script ci-dessous (c'est le même sauf que j'ai ajouté l'option
-q qui rend la commande mountpoint silencieuse) :

----------------------------------------------
#!/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 -q /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&

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

Fais une tentative directement en ligne de commandes 1) alors que la clé
n'est pas montée et 2) quand la clé est montée.


lorsque la clé est montée:
https://www.dropbox.com/s/lbng8mu9bgh7dw5/mont%C3%A9e.png
Lorsque la clé n'est pas montée
https://www.dropbox.com/s/jfa5mx5hcpknkxt/non-mont%C3%A9e.png


Dans les deux cas, le script te rend bien la main immédiatement, non ?



merci
1 2 3 4