Pages : 1
#1 Le 24/08/2010, à 09:45
- jehaane
exit et grep [ resolu ]
Bonjour ,
Saviez -vous comment arrêter l'exécution d'un script bash si la commande "grep" trouve un motif bien particulier dans sa sortie standard ?
exemple :
$ ./mon_script | if ( grep "ok" ) ; then exit ; fi
le problème ici l'exécution de mon_script ne s'arrête pas pourtant la commande "grep" trouve bien le motif "ok" dans la sortie standard ?
Des idées ?
Dernière modification par jehaane (Le 24/08/2010, à 16:28)
Hors ligne
#2 Le 24/08/2010, à 10:23
- iuchiban
Re : exit et grep [ resolu ]
bah c'est pas plus simple d'intégrer le test dans ton script ??
Sinon, tu peux tenter un
./mon_script | grep "ok" && killall mon_script
C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.
Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.
Hors ligne
#3 Le 24/08/2010, à 10:54
- jehaane
Re : exit et grep [ resolu ]
La commande killall tue des processus
Pour tuer un script il faudrait déterminer son PID
donc il est possible de faire ceci:
./mon_script | grep "ok" && " déterminer le pid de mon script" && killall pid
le problème reste comment déterminer ce PID !
Ps : je peux modifier mon script car il s'agit de tests unitaires.
Hors ligne
#4 Le 24/08/2010, à 12:00
- survietamine
Re : exit et grep [ resolu ]
salut,
je ne sais pas si ça te convient, j'ai fait un test.
génération d'un script basique :
[survietamine@minilap ~]$ echo -e '#!/bin/bash'"\necho ok\nsleep 10" > monscript.sh ; chmod +x monscript.sh
et ensuite, le test :
[survietamine@minilap ~]$ ./monscript.sh | if grep -q ok ; then echo "pattern found, i'll pkill this pid : $(pgrep -l monscript)" ; pkill monscript ; fi
le sleep ne s'exécute pas.
Mais comme l'a dit iuchiban, c'est mieux de faire le test à l'intérieur du script.
Quand tu invoques un script, ce n'est pas dans le même shell que le tien.
Et aussi le grep, on dirait qu'il attend que la sortie standard soit libérée.
Dernière modification par survietamine (Le 24/08/2010, à 12:23)
Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?
Hors ligne
#5 Le 24/08/2010, à 13:31
- iuchiban
Re : exit et grep [ resolu ]
La commande killall tue des processus
Pour tuer un script il faudrait déterminer son PID
donc il est possible de faire ceci:
./mon_script | grep "ok" && " déterminer le pid de mon script" && killall pidle problème reste comment déterminer ce PID !
Ps : je peux modifier mon script car il s'agit de tests unitaires.
./mon_script | grep "ok" && kill $(ps -ef | grep mon_script | grep -v grep | awk '{print $2}')
Si ton script est pas top secret, montre nous le code et on pourra mieux t'aider je pense
C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.
Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.
Hors ligne
#6 Le 24/08/2010, à 15:09
- jehaane
Re : exit et grep [ resolu ]
Merci pour vous tous , je vais adopter la solution de survietamine
Hors ligne
#7 Le 25/08/2010, à 14:58
- Totor
Re : exit et grep [ resolu ]
Bonjour,
Les solutions de survitamine et d'iuchiban sont dangereuses puisqu'il n'y a pas d'identification précise des processus à killer. En claire, tous les processus (qu'ils soient dans la même session ou pas) portant le nom nom_script seront killés. Certe, les processus n'appartenant pas à l'utilisateur ne seront pas killés mais si nom_script tournent dans 2 consoles distinctes, les 2 processus seront killés.
Par ailleurs, je suis étonné que la solution de survitamine fonctionne car en toute logique le kill aura lieu qu'après la fin "normale" du process nom_script puisque la commande grep ne s'arretera qu'une fois la fin du flux à lire atteint.
Ceci évite cela (mais ne permet pas d'identifier les process lancés dans la même session) :
nom_script |(grep -q -m1 a && kill $(ps -o pid,cmd --ppid $$|awk '/nom_script/ {print $1}'))
-- Lucid Lynx --
Hors ligne
#8 Le 26/08/2010, à 10:00
- jehaane
Re : exit et grep [ resolu ]
en fait j'exécute mon script en arrière plan dirigé vers un fichier temporaire puis je mets des estimations de "sleep" pour laisser le temps à écrire dans ce fichier temporaire , ensuite je fais un grep et je tue mon script.
Hors ligne
#9 Le 26/08/2010, à 10:52
- Totor
Re : exit et grep [ resolu ]
je ne comprends pas bien ta logique...
pourquoi positionner des sleep puisque le flux peut être lu à la volé ???
-- Lucid Lynx --
Hors ligne
#10 Le 26/08/2010, à 11:29
- iuchiban
Re : exit et grep [ resolu ]
je ne comprends pas bien ta logique...
pourquoi positionner des sleep puisque le flux peut être lu à la volé ???
et surtout :
Pourquoi ne pas mettre les tests d'arrêt directement dans le script ??
C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.
Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.
Hors ligne
#11 Le 26/08/2010, à 11:52
- jehaane
Re : exit et grep [ resolu ]
je ne comprends pas bien ta logique...
pourquoi positionner des sleep puisque le flux peut être lu à la volé ???
mon script ne s'arrête pas automatiquement car il y a un mot de passe qui doit être renseigner manuellement pour atteindre une fin "normale", d'où l'utilité de "sleep" .De plus je n'ai pas le droit de modifier ce script qui fait presque mille lignes.Je sais bien que c'est un peu difficile à expliquer mais bon je n'ai pas d'autres choix.
La commande "grep" lit bien à la volé la sortie de mon script , mais je dois "killé" mon processus une fois un motif est trouvé pour ne pas afficher le reste de traces d'exécution de mon script sur la sortie standard ( car il s'agit des tests unitaires , donc ce n'est pas propre de mélanger les traces d'exécution de mon script avec celles des mes tests unitaires)
Hors ligne
#12 Le 26/08/2010, à 11:58
- survietamine
Re : exit et grep [ resolu ]
dommage qu'ils n'aient pas utilisé expect pour la gestion des mots de passe.
Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?
Hors ligne
Pages : 1