[Shell] Programme fils dans un script

Résolu/Fermé
fantalbala - 11 juin 2010 à 09:43
 fantalbala - 11 juin 2010 à 14:31
Bonjour,

J'ai un tit soucis (vous l'auriez pas deviné hein :p).

Alors voilà, je voudrais faire un script shell qui permet de lancer tout une série d'autres scripts. Le soucis c'est que je sais faire ça en C/C++ avec un fork, mais je n'arrive pas à trouver de solution pour le faire en shell.

Pour être plus claire :

/home/AutomatisationSem/Script_test>ls
LancerScript.ksh ScriptALancer1.ksh ScriptALancer2.ksh ScriptALancer3.ksh ScriptALancer4.ksh ScriptALancer5.ksh etc

Lorsque je lance LancerScript.ksh (sans option !), il doit lancer ScriptALancer1.ksh attendre que celui ci soit fini puis lancer ScriptALancer2.ksh attendre que celui ci soit fini puis lancer ScriptALancer3.ksh attendre que celui ci soit fini etc

Serais t'il possible de m'aider ?

Merci d'avance :p


A voir également:

6 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
11 juin 2010 à 09:54
Salut,

LancerScript.ksh && ScriptALancer1.ksh && ScriptALancer2.ksh && ScriptALancer3.ksh && ScriptALancer4.ksh && ScriptALancer5.ksh

L'inconvénient c'est que cela pose une condition, il faut que le script qui précède "&&" se soit fini correctement, sans quoi la condition n'étant pas vérifiée, l'enchainement ne se fait pas ;-\

Une autre possibilité, est de lancer chaque script en arrière plan et d'attendre qu'il soit fini :

LancerScript.ksh &;wait; ScriptALancer1.ksh &;wait; ScriptALancer2.ksh &;wait; ScriptALancer3.ksh &;wait; ScriptALancer4.ksh &;wait; ScriptALancer5.ksh

;-))
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
11 juin 2010 à 10:05
Je ne comprend pas où est le problème.
LancerScript.ksh ; ScriptALancer1.ksh ; ScriptALancer2.ksh ; ScriptALancer3.ksh ; ScriptALancer4.ksh ; ScriptALancer5.ksh
Lance les script les un après les autre non ?
juste ajouter peut être ./ pour avoir le chemin.
Ou alors la commande source ?
0
Tu lance tout les scripts en arrière plan de cette façon (si je ne me trompe pas) mais tu n'attend pas que le premier soit fini pour lancer le deuxième et ainsi de suite =)
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
11 juin 2010 à 09:56
hello
le fork, en shell c'est &
ScriptALancer1.ksh &
ScriptALancer2.ksh &
ScriptALancer3.ksh &
ScriptALancer4.ksh &
ScriptALancer5.ksh  &

tous les scripts vont démarrer en arrière plan, en même temps
la commande wait permet d'attendre qu'ils finissent (tous ou certains)
0
Hum, merci de vos réponses.

Sauf que (forcément faut un sauf :p)

Tu lance le script avec des "options".

Je voudrais plutôt lancer le script de cette façon :

/home/AutomatisationSem/Script_test>LancerScript.ksh

Et c'est "dans" le script que tout se lance.

(Je sais pas si je suis claire ou pas ?)

En fait, j'en ai besoin c'est pour une entreprise et il y a pour l'instant 31 scripts à lancer alors ouch ! Et ça peut varier !

Au début de mon programme LancerScript.ksh je fais un ls pour récupérer le nom des scripts à lancer.

Voici le code que j'ai pour l'instant dans LancerScript.ksh :

MSGSUIVI="========= Debut du traitements =========";fonction_ecrire_suivi
MSGSUIVI="Récupération des script";fonction_ecrire_suivi
echo "Récupération des script"
ListScript='ls'

NbScript='echo $ListScript|awk -F' ' '{print NF}''
NbScript=$((${NbScript}-1))
indexScript=1

#on met les scripts dans un tableau
while [ $indexScript != $NbScript ]
do
Script='echo ${ListScript}|awk -F' ' -v i=$((${indexScript}+1)) '{print $i};' | sed -e "s/ //1"'
TabScript[$indexScript]=$Scriptt
indexScript=$((${indexScript}+1))
done


Et ici je lance les scripts se trouvant dans le répertoire les uns après les autres


MSGSUIVI="Tout les script ont été lancé";fonction_ecrire_suivi
MSGSUIVI="========= Fin du traitements =========";fonction_ecrire_suivi
echo "Fin du traitement a "'date '+%H:%M:%S''
RETSH=$OK;fonction_fin
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
11 juin 2010 à 10:15
A ce moment là, rajoute une boucle dans ton script :

for fich in $(ls *.sh | grep -v "$0")
do
./"${fich}" &
wait
done

Devrait fair l'affaire
0
Et donc je zappe mon tableau si je comprend bien ?

Bon je vaias essayer je te redis ça :p
0
Mouarf :/

Tit soucis, j'ai pas l'impression qu'il soit d'accord avec la syntaxe. J'ai comme erreur :

' unexpected.ksh[73]: syntax error at line 77 : 'do

Voilà comment j'ai modifier mon code :

MSGSUIVI="========= Debut du traitements =========";fonction_ecrire_suivi
MSGSUIVI="Récupération des script";fonction_ecrire_suivi
echo "Récupération des script"
#ListScript='ls'

#NbScript='echo $ListScript|awk -F' ' '{print NF}''
#NbScript=$((${NbScript}-1))
#indexScript=1

#on met les scripts dans un tableau
#while [ $indexScript != $NbScript ]
#do
# Script='echo ${ListScript}|awk -F' ' -v i=$((${indexScript}+1)) '{print $i};' | sed -e "s/ //1"'
# TabScript[$indexScript]=$Script
# echo ${TabScript[$indexScript]}
# indexScript=$((${indexScript}+1))
#done

echo "lancement des scripts"

for fich in $(ls *.sh | grep -v "$0")
do
"${fich}" &
wait
done


MSGSUIVI="Tout les script ont été lancé";fonction_ecrire_suivi
MSGSUIVI="========= Fin du traitements =========";fonction_ecrire_suivi
echo "Fin du traitement a "'date '+%H:%M:%S''
RETSH=$OK;fonction_fin
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
11 juin 2010 à 10:28
Le "./" devant le nom du script n'est pas une option ;-\

for fich in $(ls *.sh | grep -v "$0")
do
./"${fich}" &
wait
done
0
je l'avais mis et ça faisait pareil ;) du coup je l'ai enlever pour voir si ça ne venait pas de là :p
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
11 juin 2010 à 10:47
Oups ;-((

Modifie :

grep -v "$0"

par

grep -v "${0#*/}"

;-))
0
-_- bon on va y arriver mais ça marche toujours pas grrrrrrrrr

Voilà mon code :


MSGSUIVI="========= Debut du traitements =========";fonction_ecrire_suivi
MSGSUIVI="Récupération des script";fonction_ecrire_suivi
echo "Récupération des script"

echo "lancement des scripts"

for fich in $(ls *.ksh | grep -v "${0#*/}")
do
./"${fich}" &
wait
done


MSGSUIVI="Tout les script ont été lancé";fonction_ecrire_suivi
MSGSUIVI="========= Fin du traitements =========";fonction_ecrire_suivi
echo "Fin du traitement a "'date '+%H:%M:%S''
RETSH=$OK;fonction_fin


Tu peux m'expliquer l'expression régulière du grep s'il te plait ?

jviens de tester la boucle dans le prompt ça donne ça :

/home/AutomatisationSem/Script_test>for fich in $(ls *.ksh | grep -v "${0#*/}")
> do
> echo $fich
> done
usage: grep [-E|-F] [-c|-l|-q] [-bhinsvx] -e pattern_list...
[-f pattern_file...] [file...]
usage: grep [-E|-F] [-c|-l|-q] [-bhinsvx] [-e pattern_list...]
-f pattern_file... [file...]
usage: grep [-E|-F] [-c|-l|-q] [-bhinsvx] pattern [file...]
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
11 juin 2010 à 11:19
grep -v "$0"
Exclu le script "LancerScript.ksh" (contenu dans la variable $0) du traitement.

grep -v "${0#*/}"
Comme la variable "$0" renvoie en fait "./LancerScript.ksh", on fait en sorte de supprimer le "./" du motif de recherche...

Après je ne sais pas pourquoi ton script foire ;-((

Tu as un message d'erreur ?

Il faudrait que tu rajoute après le shebang "set -xv" pour rendre ton script verbeux et voir où ça bugue ;-((

#! /bin/ksh
set -xv
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
11 juin 2010 à 12:36
$ cat  LancerScript.ksh

#!/bin/ksh

for fich in ScriptALancer*.ksh ; do
        chmod u+x ${fich}
        ./${fich} &
done
wait
0
Je ne peux pas faire ça tout simplement parce que mes Script à lancer n'ont pas le même nom ;)
0
Ah quoi que il commence tous par Test_ jvais tenter pour voir ;)
0
AHHHHHHHHHH ! presque (ou pas :p)

Bon j'ai modifier le code et voilà ce qu'il me donne :

- le code :

MSGSUIVI="========= Debut du traitements =========";fonction_ecrire_suivi
MSGSUIVI="Récupération des script";fonction_ecrire_suivi
echo "Récupération des script"
#ListScript='ls'

#NbScript='echo $ListScript|awk -F' ' '{print NF}''
#NbScript=$((${NbScript}-1))
#indexScript=1

#on met les scripts dans un tableau
#while [ $indexScript != $NbScript ]
#do
# Script='echo ${ListScript}|awk -F' ' -v i=$((${indexScript}+1)) '{print $i};' | sed -e "s/ //1"'
# TabScript[$indexScript]=$Script
# echo ${TabScript[$indexScript]}
# indexScript=$((${indexScript}+1))
#done

echo "lancement des scripts"

for fich in 'ls Test_*.ksh'
do
ksh ${fich} &
wait
done



MSGSUIVI="Tout les script ont été lancé";fonction_ecrire_suivi
MSGSUIVI="========= Fin du traitements =========";fonction_ecrire_suivi
echo "Fin du traitement a "'date '+%H:%M:%S''
RETSH=$OK;fonction_fin

- le prompt :

/home/AutomatisationSem/Script_ksh LancerScript.ksh
Debut du traitement a 13:06:54
MSGSUIVI="========= Debut du traitements =========";fonction_ecrire_suivi
+ MSGSUIVI========== Debut du traitements =========
+ fonction_ecrire_suivi
+ echo SUIVI : ========= Debut du traitements =========
+ 1>> /home/user14/SAFRANGenericGuidingv2Unix_trunk/donnees_TD/17-LCP/Automatisation_Semaphore/Logs/LancerScript.ksh_20100611.log
MSGSUIVI="Récupération des script";fonction_ecrire_suivi
+ MSGSUIVI=Récupération des script
+ fonction_ecrire_suivi
+ echo SUIVI : Récupération des script
+ 1>> /home/user14/SAFRANGenericGuidingv2Unix_trunk/donnees_TD/17-LCP/Automatisation_Semaphore/Logs/LancerScript.ksh_20100611.log
echo "Récupération des script"
+ echo Récupération des script
Récupération des script
#ListScript='ls'

#NbScript='echo $ListScript|awk -F' ' '{print NF}''

for fich in Test_*.ksh ; do
' unexpected.ksh[74]: syntax error at line 83 : 'do
SRV110:/home/user14/SAFRANGenericGuidingv2Unix_trunk/AutomatisationSem/Script_ksh LancerScript.ksh
Debut du traitement a 13:07:58
MSGSUIVI="========= Debut du traitements =========";fonction_ecrire_suivi
+ MSGSUIVI========== Debut du traitements =========
+ fonction_ecrire_suivi
+ echo SUIVI : ========= Debut du traitements =========
+ 1>> /home/user14/SAFRANGenericGuidingv2Unix_trunk/donnees_TD/17-LCP/Automatisation_Semaphore/Logs/LancerScript.ksh_20100611.log
MSGSUIVI="Récupération des script";fonction_ecrire_suivi
+ MSGSUIVI=Récupération des script
+ fonction_ecrire_suivi
+ echo SUIVI : Récupération des script
+ 1>> /home/user14/SAFRANGenericGuidingv2Unix_trunk/donnees_TD/17-LCP/Automatisation_Semaphore/Logs/LancerScript.ksh_20100611.log
echo "Récupération des script"
+ echo Récupération des script
Récupération des script

echo "lancement des scripts"
+ echo lancement des scripts
lancement des scripts

for fich in 'ls Test_*.ksh'
do
ksh ${fich} &
wait
done


MSGSUIVI="Tout les script ont été lancé";fonction_ecrire_suivi
MSGSUIVI="========= Fin du traitements =========";fonction_ecrire_suivi
echo "Fin du traitement a "'date '+%H:%M:%S''
RETSH=$OK;fonction_fin
LancerScript.ksh[74]: syntax error at line 89 : 'for' unmatched

Maintenant c'est le for qui bug u_u
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
11 juin 2010 à 14:21
Et avec juste :

for fich in Test_*.ksh
0
bon c'est sensé marcher mais non -_-
0
YEAH !!!!! ça marche ;)

je suppose que le problème (tout con vous allez rire d'ailleurs :p) vient tout simplement d'un caractère caché.

Effectivement, mes scripts sont écrit sous Windows avec UltraEdit. Le truc qui va vous faire bien rire, c'est que j'ai l'impression que le copier/coller sauvage il n'apprécie pas :p.

Du coup, là je viens de réécrire mon code et de virer les lignes blanches, puis j'ai reconverti (au cas où ça venait de là :p). Et là je viens d'avoir le plaisir de lancer le script et qu'il fonctionne =)

Allez pour le plaisir des yeux voici le fameux code :

#!/bin/ksh
#set -x
echo "Debut du traitement a "'date '+%H:%M:%S''
#######################################################################
# Debut modif : initialisation des variables

NbParam=$#

#Declaration du nom du fichier trace
FICLOG="${0}_'date +%Y%m%d'.log"

#Declaration de variable
KO=255
OK=0

# Fin modif : initialisation des variables
#######################################################################

if [ $NbParam -eq 1 ]
then
if [ $1 = "--help" ] || [ $1 = "-h" ]
then
echo "\tUsage de $0 :"
echo "\tUsage : $0"
echo "\tUsage : Lance tout les scripts se trouvant dans le Repertoire Script_test"
exit $OK
fi
fi

#######################################################################
# Debut modif : creation librairies
#chargement des fonctions de trace
. $HOME/donnees_TD/17-LCP/Automatisation_Semaphore/Automatisation/libtracestest.ksh

#valorisation du nom du script
NOM_SCRIPT='basename $0'

# Fin modif : creation librairies
#######################################################################

#######################################################################
# Debut modif : Ecriture dans le fichier trace
#Controle et initialisation de la trace
FICLOG='fonction_initialisation_trace ${NOM_SCRIPT}'
# Fin modif : Ecriture dans le fichier trace
#######################################################################

NOMTRT=$0
#Initialisation du fichier trace
RETSH=$KO;fonction_debut

#######################################################################
# Debut des traitements
#######################################################################
set -xv
MSGSUIVI="========= Debut du traitements =========";fonction_ecrire_suivi
MSGSUIVI="Récupération des script";fonction_ecrire_suivi
echo "lancement des scripts"

for fich in Test_*.ksh
do
ksh ${fich} &
wait
done

MSGSUIVI="Tout les script ont été lancé";fonction_ecrire_suivi
MSGSUIVI="========= Fin du traitements =========";fonction_ecrire_suivi
echo "Fin du traitement a "'date '+%H:%M:%S''
RETSH=$OK;fonction_fin


(bon oki je dois virer des affectation qui sont en trop ;) )

Merci à tous ceux qui m'ont aidés =)
0