# [CRON] probleme de lancement de script (resolu)

## Farnsworth

Bonjour,

Je suis en train d'essayer de me mettre en place un script de reconnexion automatique a mon AP wifi que je perds tres frequemment.

Donc je souhaite mettre un script de reconnexion qui serait execute toutes les minutes par exemple dans la crontab.

Seul probleme, au debut de ce script je verifie s'il ne tourne pas deja (si le script tourne deja il sort, ensuite si la connexion est OK il sort aussi, mais si elle est KO il tente de se reconnecter plusieurs fois et ca peut durer plus ou moins longtemps, la demande d'adresse DHCP est parfois tres longue), mais quand je fais mon 'ps -ef | grep `basename $0` | grep -v grep | grep -v $$' (je cherche un eventuel process portant le meme nom, mais dont le PID serait different du mien) je me retrouve en permanence avec une reponse de 1 ou plusieurs lignes quand c'est lance par la crontab.

quand je lance mon script a la main ca fonctionne tres bien, en revanche via la crontab il detecte tout le temps qu'un script est deja en execution alors que ca n'est pas le cas.

Si je fais un script qui fait simplement:

 *Quote:*   

> echo $$
> 
> ps -ef | grep `basename $0` | grep -v grep

 

Et que je le met dans la crontab, je me retrouve avec ca:

 *Quote:*   

> 22305
> 
> root     22302 22301  0 20:01 ?        00:00:00 /bin/sh -c /root/test.sh >> /tmp/test.log 2>&1
> 
> root     22305 22302  0 20:01 ?        00:00:00 /bin/sh -c /root/test.sh >> /tmp/test.log 2>&1
> ...

 

Est-ce normal? j'ai essaye de voir si je n'avais pas plusieurs cron qui tournaient mais ca n'a pas l'air d'etre le cas...

un autre script me renvoi plus de process (5) c'est vraiment etrange!

Merci,

Max

----------

## Farnsworth

Personne pour m'aider, c'est tres genant ce truc, je ne peux pas faire ce que je souhaite.

ou alors si vous avez un autre moyen de reconnexion auto? (mais je suis quand meme interesse par la resolution de mon probleme de cron  :Wink:  )

----------

## netfab

Salut,

Pourquoi ne pas utiliser un fichier temporaire pour détecter si ton script est en cours d'éxécution ou non ?

Au début de ton script, tu regardes si le fichier /tmp/.monfichiertemp existe.

Si oui, tu sors, si non, tu le créés. Et à la fin d'une éxécution complète, tu le supprimes.

----------

## Farnsworth

Merci,

j'y ai pense, mais si le script se termine mal (arret de la machine pendant le script ou autre) le fichier reste en place et il ne redemarrera pas tout seul par la suite (ou alors il faut que je le supprime au boot ou alors que je compare la date du dernier boot avec la date du fichier).

c'est effectivement une solution, mais je preferai passer par une verif en "temps reel", pas par l'existance d'un fichier.

ce qui m'etonne la dedans, c'est le comportement de la crontab, pourquoi je me retrouve avec plusieurs process lances au meme moment, qui portent le meme nom et qui ont en plus des liens de parenté?

----------

## Prophidys

Essaye de donner le script en entier !

----------

## kwenspc

oui je suis interessé par le script. ça doit venir de là

----------

## Prophidys

les grands esprits se rencontrent   :Razz: 

----------

## Farnsworth

je l'ai deja donne plus haut, il manque juste le debut:

#!/bin/ksh ou bash je sais plus

echo $$

ps -ef | grep `basename $0` | grep -v grep

c'est tout ce qu'il fait.

enfin ca c'est mon script de test, l'autre si vous le voulez faudra attendre ce soir  :Wink: 

sachant que l'un comme l'autre, quand je les execute a la mano ils fonctionnent correctement!

----------

## Prophidys

Je crois que cron fork ton script pour le passer en demon si je me rappel mes cours lointain de systeme unix. Bref il lance le script et le fork aussitot ... Enfin c'est ce que ca semble faire ... Aprés je ne peut en être certain a 100%

----------

## Farnsworth

Non, je ne crois pas, en tout cas ca me dit rien et pourtant j'en ai fait pas mal des scripts unix.

Je viens de tester sous aix, j'obtiens ca:

```
96396

    root 96396 11616   5 16:47:00      -  0:00 /bin/ksh /root/test.sh

28544

    root 28544 11616   5 16:49:00      -  0:00 /bin/ksh /root/test.sh
```

le process pere (11616) est bien le demon cron, tout est logique la:

```
[root]/root ps -ef | grep 11616

    root 11616     1   0   Sep 05      -  0:26 /usr/sbin/cron
```

faudrait que je teste avec un autre cron (j'utilise vixie-cron je crois), je sais pas trop ce qui existe...

----------

## _droop_

Salut,

Je vois que tu as 2 processus dont un est le fils de l'autre. A priori c'est normal (je me rappelle plus pourquoi, une histoire de fork par le shell). 

Dans mon script pour detecter les processus doublons sans détecter le père je un truc de ce genre :

```
ppid = `ps -ef | awk \'{if (\$2 == $$) {print \$3}}\'`

ps -ef | grep './$scriptFileName' | grep -v grep  | grep -v $$ | awk "{if (\$2 != $ppid) {print \$2}}"
```

----------

## neysx

```
#!/bin/bash

pstree -Alp | grep `basename $0` | grep -v $$ > /dev/null && echo RAF && exit

echo Au boulot! && sleep 65
```

 *crontab -l wrote:*   

> # DO NOT EDIT THIS FILE - edit the master and reinstall.
> 
> # (/tmp/crontab.XXXXnGKMp8 installed on Tue Jan 23 18:32:26 2007)
> 
> # (Cron version V5.0 -- $Id: crontab.c,v 1.12 2004/01/23 18:56:42 vixie Exp $)
> ...

 

----------

## Farnsworth

Yes, merci, ca me plait bien cette soluce, je teste ca rapidement.

par contre, c'est quand meme tres etrange comme comportement avec tous ces forks, j'ai remis mon script original en place et voila ce qu'il me logue:

```
11037

root     11036 11034  0 19:20 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11037 11036  0 19:20 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11039 11037  0 19:20 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11040 11039  0 19:20 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11041 11037  0 19:20 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

ca marche

11095

root     11093 11092  0 19:21 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11095 11093  0 19:21 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

ca marche

11144

root     11141 11140  0 19:22 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11144 11141  0 19:22 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

ca marche

11191

root     11190 11189  0 19:23 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11191 11190  0 19:23 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11193 11191  0 19:23 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11194 11193  0 19:23 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11195 11194  0 19:23 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

ca marche

11245

root     11238 11237  0 19:24 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11245 11238  0 19:24 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11247 11245  0 19:24 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11248 11247  0 19:24 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11249 11245  0 19:24 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

ca marche

11287

root     11285 11284  0 19:25 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11287 11285  0 19:25 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

ca marche

11350

root     11347 11346  0 19:26 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11350 11347  0 19:26 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11352 11350  0 19:26 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11353 11352  0 19:26 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

root     11354 11353  0 19:26 ?        00:00:00 /bin/sh -c /root/reconnect.sh 2 >> /tmp/reconnect.log 2>&1

ca marche
```

et voici le script en question:

```
#/bin/bash

echo $$

ps -ef | grep `basename $0` | grep -v grep

#ps -ef | grep `basename $0` | grep -v grep | grep -v $$ > /dev/null 2>&1

#if [ $? = 0 ] #le script tourne deja

#then

        #echo deja en execution. sortie!

        #exit

#fi

if [ -z $1 ]

then

        count=5

else

        count=$1

fi

for i in `/usr/bin/seq $count`

do

        /etc/init.d/net.ra0 status > /dev/null 2>&1

        /bin/ping -c 1 -w 3 -W 3 -n 212.27.53.252 > /dev/null 2>&1

        if [ $? = 0 ] #Ca marche

        then

                /usr/bin/echo ca marche

                break

        else #Ca marche po / On relance

                /usr/bin/echo essai $i

                /sbin/ifconfig ra0 up && /etc/init.d/net.ra0 --verbose restart

                /usr/bin/sleep 2

        fi

done
```

vraiment etrange comme comportement, parceque un pere et un fils je veux bien, mais la c'est aleatoire, j'en ai jusqu'a 5 en simultane   :Confused: 

----------

## Farnsworth

Ouppss...

j'ai un petit peu oublie le ! dans la ligne de shell de mon script   :Embarassed: 

du coup il devait forker un peu bizarrement, en la rajoutant je n'ai plus que que ca:

```
root     14433 14432  0 19:52 ?        00:00:00 /bin/sh -c /root/reconnect.sh 10 >> /tmp/reconnect.log 2>&1

root     14434 14433  0 19:52 ?        00:00:00 /bin/bash /root/reconnect.sh 10

root     14436 14434  0 19:52 ?        00:00:00 /bin/bash /root/reconnect.sh 10
```

bon, du coup je comprends un peu mieux mais je trouve ca etrange quand meme  :Sad: 

bref, ca marche avec pstree.

Merci bien.

++

----------

## Farnsworth

non, finallement ca ne marche pas, il me dit de temps en temps que le script tourne deja alors que ca n'est pas le cas...

donc le sujet est toujours ouvert, je ne comprends pas bien ce comportement.

----------

## Farnsworth

bon, apres divers essais j'ai enfin trouve, c'est simplement ma commande 'ps' avec le `basename` et les grep dedans qui me cree de nouveaux process, il me suffit de mettre ce basename dans une variable au debut du shell, de rediriger le ps dans un fichier et de faire le tri ensuite et je n'ai plus le souci...

j'espere que ce coup-ci est le bon, parceque je desespere la  :Wink: 

etrange quand meme comme comportement, je sais pas pourquoi les process portent le meme nom   :Question: 

la bidouille en question pour ceux que ca interesserait:

```
ps -ef > /tmp/reconnect_$$

grep `basename $0` /tmp/reconnect_$$ | grep -v grep | grep -v $$ | grep -v `ps -fp $$ | tail -1 | awk ' { printf $3 } '` > /dev/null 2>&1
```

je garde les scripts qui portent le meme nom, j'elimine mon numero de process et mon pere de la liste (et les eventuels grep).

----------

