[Shell] Programme fils dans un script

Résolu
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

6 réponses

Résumé de la discussion

Plusieurs échanges portent sur la création d'un script shell capable de lancer une série de scripts de manière séquentielle, en attendant la fin de chacun avant de passer au suivant. La meilleure réponse identifie que le problème provenait probablement de caractères cachés issus d’écritures sur Windows et que la réécriture, la suppression de lignes blanches et une nouvelle conversion résolvent le fonctionnement. En complément, la discussion met en évidence que la compatibilité Unix/Windows et la normalisation des fins de ligne influent fortement sur l’exécution, d’où l’importance de convertir et nettoyer les scripts lors de leur utilisation.

Bobot (l’IA à votre service)
  1. Modérateur
    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
    1. Contributeur
      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
    2. 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
  2. Contributeur
    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
    1. 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
      1. Modérateur
        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
      2. Et donc je zappe mon tableau si je comprend bien ?

        Bon je vaias essayer je te redis ça :p
        0
    2. 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
      1. Modérateur
        Le "./" devant le nom du script n'est pas une option ;-\

        for fich in $(ls *.sh | grep -v "$0")
        do
        ./"${fich}" &
        wait
        done
        
        0
      2. 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
      3. Modérateur
        Oups ;-((

        Modifie :

        grep -v "$0"

        par

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

        ;-))
        0
      4. -_- 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
      5. Modérateur
        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
    3. Contributeur
      $ cat  LancerScript.ksh
      
      #!/bin/ksh
      
      for fich in ScriptALancer*.ksh ; do
              chmod u+x ${fich}
              ./${fich} &
      done
      wait
      
      0
      1. Je ne peux pas faire ça tout simplement parce que mes Script à lancer n'ont pas le même nom ;)
        0
      2. Ah quoi que il commence tous par Test_ jvais tenter pour voir ;)
        0
    4. 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
      1. Modérateur
        Et avec juste :

        for fich in Test_*.ksh
        0
      2. bon c'est sensé marcher mais non -_-
        0
      3. 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