Plantage de script shell

Plantage de script shell - Shell/Batch - Programmation

Marsh Posté le 25-08-2005 à 13:37:11    

Voici le code d'un script shell :

01. #!/bin/sh
02.  
03. while true ; do
04.         # parcourt de tous les fichiers de peripheriques USB HID
05.         # presents dans /dev/usb/hid et lancement du convertisseur
06.         # souris sur le premier correspondant a une souris.
07.         for I in /dev/usb/hid/* ; do
08.                 hiddevicetype $I > /dev/null
09.                 if [[ $? == 2 ]] ; then
10.                         convertsouris $I /dev/tts/1
11.                         # Une fois la conversion lancee, elle ne retourne que
12.                         # si elle est arretee ou si la souris est debranchee.
13.                         break
14.                 fi
15.         done
16.         sleep 1
17. done


 
Ce script est la pour lancer un programme (convertsouris) quand une souris USB est branchée sur le systeme.
 
Lorsque rien n'est branché en USB, /dev/usb/hid/ est vide, donc on ne passe pas dans le for.
 
Dans ce cas (rien de branché), au bout de quelques minutes, le script se plante en mettant :
 

/etc/Modconv/souris_loop.sh: line 17:  6926 Segmentation fault      sleep 1


 
Une idée de pourquoi je me prends un segfault sur un sleep ?

Reply

Marsh Posté le 25-08-2005 à 13:37:11   

Reply

Marsh Posté le 25-08-2005 à 14:00:12    

Citation :

Lorsque rien n'est branché en USB, /dev/usb/hid/ est vide, donc on ne passe pas dans le for.


 :non:  
Essaie donc ça pour t'en convaincre :  

#!/bin/sh
for toto in /un_repertoire_vide/*
do
echo " ** " : $toto
done


 
Remplace ton for par ceci :

ls /dev/usb/hid | while read I


 
Remarque :

if [[ $? == 2 ]]  


 
Pourquoi les doubles "[" ? De plus, "==" est un opérateur entre chaine de caractères. Utilise -eq plutôt :

if [ $? -eq 2 ]


Message édité par Grululu le 25-08-2005 à 14:10:29
Reply

Marsh Posté le 25-08-2005 à 16:32:24    

Fait un "ulimit -c unlimited", puis lance ton script. Apres le segfault tu devrais avoir un fichier "core" dans le repertoire courant. Fait "file core"... Ca te donne le nom du soft qui a plante.

Reply

Marsh Posté le 25-08-2005 à 18:44:00    

Grululu a écrit :


 :non:  
Essaie donc ça pour t'en convaincre :  

#!/bin/sh
for toto in /un_repertoire_vide/*
do
echo " ** " : $toto
done


 
Remplace ton for par ceci :

ls /dev/usb/hid | while read I


 
 
 
Remarque :

if [[ $? == 2 ]]  


 
Pourquoi les doubles "[" ? De plus, "==" est un opérateur entre chaine de caractères. Utilise -eq plutôt :

if [ $? -eq 2 ]



 
Vu, je corrigerai ca demain.
 

matafan a écrit :

Fait un "ulimit -c unlimited", puis lance ton script. Apres le segfault tu devrais avoir un fichier "core" dans le repertoire courant. Fait "file core"... Ca te donne le nom du soft qui a plante.


 
Heu ca va comme qui dirait pas être possible, ca, le FS est en lecture seule... (et à priori tous ces outils ulimit et file risquent de ne pas être dispo... J'ai droit à un bash et à un busybox allégé à mort...)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed