[Shell] Programme fils dans un script

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

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      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. fantalbala
       
      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. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    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
  3. fantalbala
     
    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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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. fantalbala
       
      Et donc je zappe mon tableau si je comprend bien ?

      Bon je vaias essayer je te redis ça :p
      0
  4. fantalbala
     
    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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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. fantalbala
       
      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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Oups ;-((

      Modifie :

      grep -v "$0"

      par

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

      ;-))
      0
    4. fantalbala
       
      -_- 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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    $ cat  LancerScript.ksh
    
    #!/bin/ksh
    
    for fich in ScriptALancer*.ksh ; do
            chmod u+x ${fich}
            ./${fich} &
    done
    wait
    
    0
    1. fantalbala
       
      Je ne peux pas faire ça tout simplement parce que mes Script à lancer n'ont pas le même nom ;)
      0
    2. fantalbala
       
      Ah quoi que il commence tous par Test_ jvais tenter pour voir ;)
      0
  7. fantalbala
     
    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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Et avec juste :

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