IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Assignement de variable en background ?


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Par défaut Assignement de variable en background ?
    Bonjour,
    Je voudrais faire un test pour evaluer si les serveurs sont en ligne. Voici mon script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #! /bin/sh
     
    timeout=5
     
    #do the ssh test with timeout
    for i in 01 02 $(seq -w 5 20); 
    do 
        j=$(echo $i|sed 's/^0*//') #remove leading 0 so that index is not octal based
     
        echo $i;
        ssh_test[$j]=$(ssh -o ConnectTimeout=$timeout n00$i "echo 1" 2> /dev/null) & # <== ICI LE PROBLEME
    done
     
    wait
     
    # print the results in correct order
    for i in 01 02 $(seq -w 5 20); 
    do
        j=$(echo $i|sed 's/^0*//') #remove leading 0 so that index is not octal based
     
        echo $i $j ${ssh_test[$j]} 
        if [[ ${ssh_test[$j]}  == 1* ]] ; 
            then echo -e "$i: \e[1;32mok\e[0m"; 
            else echo -e "$i: \e[1;31mfailed\e[0m";
        fi; 
    done
    Mais je n'arrive pas a rouler les commandes en arrière plan de sorte que ca n'attendent que 5 secondes, soit le resultats de toutes les requetes en meme temps. Mon script fonctionne si je retire le esperluette de l'assignation de la variable.
    Sauriez vous faire cette assignation en parrallele ?
    Merci
    Z.

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    tu dois pouvoir mettre ça dans une fonction


    genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    toto ()
    {
    #bout de code
    }
     
    for truc
    do
       toto &
    done
    ca change beaucoup la structure mais dans tous les cas ou une boucle est un problème temporel c'est la solution.
    L'idée est simple... au lieu de mettre une commande en arrière plan c'est la fonction qui la contient qui est en arrière plan...

    ca permet aussi avec un peu d'ingéniosité dans un cas comme le tiens de pas avoir 2 boucles for .... si tu te casse l'oignon pour coder l'affichage dynamique des resultats tu n'en as plus qu'une seule ce qui accélère considérablement la durée totale du script.

  3. #3
    Membre émérite
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Par défaut
    Merci de ta réponse. Mais :
    Ceci me donne le même résultat. Sans le esperluette, je récupère 1 dans mon tableau lorsque la commande ssh s'est exécutée avec succès. Avec esperluette, je ne récupère rien.
    Le but des 2 boucles est de pouvoir afficher les résultats dans l'ordre.
    Le but du ssh en background est de pouvoir tous les lancer d'un bloc, et que le script ne dure que le temps du timeout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #! /bin/sh
     
    timeout=5
     
    ssh_function() {
        echo $1;
        j=$(echo $1|sed 's/^0*//') #remove leading 0 so that index is not octal based
        ssh_test[$j]=$(ssh -o ConnectTimeout=$timeout n00$1 "echo 1" 2> /dev/null)
    }
     
    #do the ssh test with timeout
    # for i in 01 02 $(seq -w 5 20); 
    for i in 01 02; 
    do
        ssh_function $i &
    done
     
    wait
     
    # print the results in correct order
    for i in 01 02 $(seq -w 5 20); 
    do
        j=$(echo $i|sed 's/^0*//') #remove leading 0 so that index is not octal based
     
        echo $i $j ${ssh_test[$j]} 
        if [[ ${ssh_test[$j]}  == 1* ]] ; 
            then echo -e "$i: \e[1;32mok\e[0m"; 
            else echo -e "$i: \e[1;31mfailed\e[0m";
        fi; 
    done

  4. #4
    Membre émérite
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Par défaut
    Il semble qu'on ne puisse pas recuperer la variable d'une fonction en arriere plan a moins de la stocker dans un fichier, ou de la rendre global au shell courant.
    J'ai opté pour la 1ere solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #! /bin/sh
     
    timeout=5
    PID=$$
    ME=`basename $0`
     
    ssh_function() {
        $(ssh -o ConnectTimeout=$timeout n00$1 "echo 1" 2> /dev/null 1> /dev/shm/$ME.$1.PID)
    }
     
    #do the ssh test with timeout
    for i in 01 02 $(seq -w 5 20)
    do
        ssh_function $i &
    done
     
    sleep $timeout
     
    # print the results in correct order
    for i in 01 02 $(seq -w 5 20); 
    do
        if [[ $(cat /dev/shm/$ME.$i.PID)  == 1* ]] ; 
            then echo -e "$i: \e[1;32mok\e[0m"; 
            else echo -e "$i: \e[1;31mfailed\e[0m";
        fi; 
    done
    merci de votre aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Free Pascal] [2.2] Impossible d'assigner une variable de type T à une variable de type T
    Par Hibou57 dans le forum Free Pascal
    Réponses: 3
    Dernier message: 12/10/2007, 12h31
  2. Assigner valeurs variables comp. TextArea
    Par delavega dans le forum Flash
    Réponses: 1
    Dernier message: 07/09/2006, 11h27
  3. Réponses: 13
    Dernier message: 30/05/2006, 16h00
  4. Réponses: 2
    Dernier message: 13/03/2006, 11h47
  5. [VB.Net]Comment assigner contenu variable> nom variable ?
    Par jazz matazz dans le forum VB.NET
    Réponses: 4
    Dernier message: 03/02/2006, 17h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo