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 :

Exercice avec plusieurs fonctions actives dans un script bash


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut Exercice avec plusieurs fonctions actives dans un script bash
    Bonjour


    J'ai un bout de code qui peut exécuter jusqu'a 3 fonctions, tout dépend du résultat que donne chacune d'elle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    fonction_1(){
               echo -e "On appelle la fonction_2"
    fonction_2
    echo -e "on continue le code de la fonction 1 une fois que la fonction 2 a été lancé"
    ...code a exécuter tant que le fichier test.txt est vide...
    until test -s /var/www/test.txt; do 
    sleep 60;
    done

    Dans la fonction 2 j'ai ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    xterm -hold -bg '#codecouleur' -fg '#codecouleur' -e watch -n $xseconde ps -ef > output.txt  &> /dev/null &
    sleep 5;
    if grep -q "apache2" "output.txt" ; then 
       echo -e "\t\e[1;32m [+] apache est déja lancé"
    else
        echo -e "\e[1;31m [!] apache n'est pas lancé, lancement en court\e[0m"
    fonction_3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fonction_3
    echo -e "Lancement et configuration de apache"
    xterm commande 1
    xterm commande 2
    etc...

    La fonction 2 doit s'exécuter toute les x secondes et appeler la fonction 3 au besoin.

    J'ai 2 problème, le premier c'est que si la fonction 3 se lance je dois pouvoir revenir a la fonction 2 qui effectue le test toute les x secondes pour re tester la variable dans le output.txt.
    Le second c'est nettoyer les xterm de la fonction 3 avant de revenir dans la fonction 2 qui re-teste la variable dans le output.txt

    Le tout sans interrompre ou géner la fonction 1 qui test le fichier test.txt en boucle (c'est d'ailleurs pour ça que j'ai penser a xterm)


    Ce n'est pas dans un cadre professionnel mais plus pour m'entrainer a gérer plusieurs process avec bash ^^
    Comment faire ça proprement ?

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 538
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 538
    Points : 19 360
    Points
    19 360
    Par défaut
    Bonjour,

    j'ai l'impression que tu as commencé à coder avant d'écrire un algorithme... :/
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Ce qui veut dire ?

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 538
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 538
    Points : 19 360
    Points
    19 360
    Par défaut
    comment veux-tu que je te le dise autrement ?

    on définit l'objectif à atteindre, et on liste toutes les opérations à effectuer en précisant leur enchaînement (algorithme) avant d'écrire des commandes dans un fichier (coder).
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Ah la je comprends mieux, c'est le mot "algorithme" qui m'a un peu perturbé

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    j'ai l'impression que tu as commencé à coder avant d'écrire un algorithme... :/
    [Hors sujet]
    Ce qu'un de mes chefs de projets appelait : programmer comme un boxeur.
    Tu tapes (sur le clavier) avant de réfléchir.
    [/Hors sujet]
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 862
    Points
    30 862
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par david633 Voir le message
    Bonjour
    Bonjour

    Citation Envoyé par david633 Voir le message
    J'ai 2 problème, le premier c'est que si la fonction 3 se lance je dois pouvoir revenir a la fonction 2 qui effectue le test toute les x secondes pour re tester la variable dans le output.txt.
    Tu ne peux pas revenir à la f2 tant que la f3 (qui a été appelée par f2) n'est pas finie. Mais en revanche tu peux interrompre f3 sur certaines conditions...

    Citation Envoyé par david633 Voir le message
    mais plus pour m'entrainer a gérer plusieurs process avec bash ^^
    Hum, lancer des xterm en rafale génère bien plusieurs process mais je ne vois pas trop de "gestion" là dedans. Les process sont indépendants et ne communiquent pas entre eux.

    Citation Envoyé par david633 Voir le message
    Comment faire ça proprement ?
    Mieux exposer ton problème. D'une part ça te permettra de mieux voir la solution et d'autre part ça nous éclairera aussi parce que là ça reste très obscur. Ce qui se conçoit bien s'énonce clairement...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Je comprends vos avis et je m'excuse de pas avoir été assez clair



    En mettant de l'ordre dans mes idées et dans mon code j'ai "presque" réussi a faire ce que je voulais.Donc on a plus 3 fonction mais 2.La fonction 1 éxécute 2 commande en xterm tant que le fichier test.txt n'est pas rempli, la fonction 2 est appelée toute les x seconde.Le code de la seconde fonction 2 n'est pas important mais une fois qu'elle s'est terminée elle revient dans la fonction 1 en l'appelant tout simplement.Voici le code de la fonction 1 qui gère le tout.Tout se passe bien sauf au moment de revenir au menu principale, il semble avoir des difficulté a sortir des boucles:

    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
    f_1(){
               echo -e "\e[1;34m[*]\e[0m On commence la fonction 1"
    sleep 1;
    xterm -hold -bg '#000000' -fg '#3A94FF' -e commande1 &> /dev/null &
    echo $! >/root/commande1.pid
    sleep 1;
    xterm -hold -bg '#000000' -fg '#3A94FF' -e commande2 &> /dev/null &
    echo $! >/root/commande2.pid
    sleep 1;
    while : ; do
    sleep ${seconde} ; f_2; done &          # Appelle de la fonction 2 toute les x seconde
    echo $! >/root/pidelabouclewhile.pid   # On prend le PID de la boucle while qui appelle la fonction 2 toute les x ${seconde}
    until test -s /apache2/test.txt; do 
    sleep 1;
    done
    echo -e "\e[1;34m[*]\e[0m Fichier test rempli, arrét de la fonction 2 et retour au menu principal"
              kill 9 `cat /root/pidelabouclewhile.pid`  # Arret du PID de la boucle while qui appelle la fonction 2 toute les x ${seconde}
              rm -rf pidelabouclewhile.pid
    sleep 1;
              kill `cat /root/commande1.pid`
    sleep 1;
              kill `cat /root/commande2.pid`
    sleep 1;
    f_mainmenu
    }

    Je précise que tout marche bien sauf quand je reviens au menu principal, il s'affiche je ne sais combien de fois a la suite, et je dois faire un ctrl+c pour sortir de la.En gros ça me donne sa:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Test des fichiers
    test des fichiers
    test des fichiers
    etc...
    "Test des fichier" est le menu principal.
    Pourtant j'ai mis un kill 9 sur ma boucle while et le until attend bien que le fichier test soit rempli puisque

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo -e "\e[1;34m[*]\e[0m Fichier test rempli, arrét de la fonction 2 et retour au menu principal"
    s'affiche et que les PID de commande1 et commande2 ont été effacés.Donc la... je sèche.Dois-je passer par une fonction intermédiaire qui vérifis que tout les process sont stopé avant de revenir au menu principal ?



    Je sais que la plupart d'entre vous etes des professionnel ou étudiant en informatique, je ne suis ni l'un ni l'autre mais juste un utilisateur de plusieurs version de GNU/linux qui s'éclate a sa manière

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 862
    Points
    30 862
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par david633 Voir le message
    La fonction 1 exécute 2 commande en xterm tant que le fichier test.txt n'est pas rempli, la fonction 2 est appelée toute les x seconde. Le code de la seconde fonction 2 n'est pas important mais une fois qu'elle s'est terminée elle revient dans la fonction 1 en l'appelant tout simplement.
    Ben oui mais non. Si tu as f1 qui appelle f2, et f2 qui appelle f1 ce n'est pas un "retour" à f1 mais un nouvel appel à f1 qui s'empile dans la liste des appels. Et tant que le dernier appel n'est pas terminé, l'avant dernier l'attend et etc...

    Voici un petit exemple de f1 qui appelle f2 avec un vrai retour à f1 si f2 ne réussit pas
    Code bash : 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
    #!/bin/bash
     
    f1() {
    	while true; do
    		f2; status=$?
    		test $status -eq 0 && break
       		echo "f2 échouée - retry"
    		sleep 1
    	done
    	echo "f2 ok, on fait la suite"
    	echo "blablabla"
    }
     
    f2() {
    	test $(($RANDOM % 3)) -eq 0 && return 0 || return 1
    }
     
    f1

    Et ça marche aussi avec un script "f1.sh" qui appellera "f2.sh" si on remplace return par exit.

    f1.sh
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    while true; do
    	./f2.sh; status=$?
    	test $status -eq 0 && break
    	echo "f2 échouée - retry"
    	sleep 1
    done
    echo "f2 ok, on fait la suite"
    echo "blablabla"

    f2.sh
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
     
    test $(($RANDOM % 3)) -eq 0 && exit 0 || exit 1


    Par ailleurs méfies-toi des kill. Ce n'est pas parce que tu tues un père que tu tues obligatoirement les fils qui s'y rattachent...

    Citation Envoyé par david633 Voir le message
    Je sais que la plupart d'entre vous etes des professionnel ou étudiant en informatique, je ne suis ni l'un ni l'autre mais juste un utilisateur de plusieurs version de GNU/linux qui s'éclate a sa manière
    Oui, nous aussi
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Merci ^^

    J'ai pu résoudre mon problème grace a ton morceau de code


    Une dernière question après je vous embete plus , je m'entraine avec la commande export qui a l'air assez puissante mais j'ai remarqué quelque chose de bizarre, quand j'export des variables d'un script bash 1 a un script bash 2, ça se passe bien sauf pour les pointillés apparemment:

    script1.sh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    export ${nom}
    export ${age}
    export ${date}
    bash -c script2.sh
    Sortie du script2.sh avec les echo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ligne 3       27:03:1984       identifiant invalide
    David
    33

    Si je rentre la date avec les pointillés ou avec / ça passe pas, mais rentrer en "cru" si je puis dire sans espace ni symbole ça passe.

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 538
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 538
    Points : 19 360
    Points
    19 360
    Par défaut
    ce n'est pas comme ça qu'on exporte des variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ var="bla bla"
    $ export var
    $ bash -c 'echo "$var"'
    bla bla
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par david633 Voir le message
    script1.sh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    export ${nom}
    export ${age}
    export ${date}
    bash -c script2.sh
    Dans ce script, tu n'exportes pas les variables "nom" "age" et "date", mais leur contenu.

    Si la variable "nom" contient la chaine "toto", c'est comme si tu demandais au shell d'exporter une variable nommée "toto" (comme si tu avais tapé export toto).
    Il se trouve que la chaine "toto" est une chaine valide pour un nom de variable, donc ça marche (pas comme tu veux, mais ça marche; en tout cas, ça plaît au shell!).
    Il se peut que la variable nommée "toto" contienne une valeur ou pas (ce qui est plus probable dans ton contexte).

    Pour les variables "age" et "date", comme tenu de leur nom et la probable sémantique attachée, il est fort probable que leur contenu ne soit pas un nom de variable valide, ce qui fait que le shell n'est pas content et le dit.

Discussions similaires

  1. créer un script avec plusieurs fonctions
    Par kimi33 dans le forum Oracle
    Réponses: 3
    Dernier message: 15/01/2008, 18h03
  2. [PHP-JS] fonction javascript dans un script PHP
    Par guy2004 dans le forum Langage
    Réponses: 7
    Dernier message: 19/11/2006, 18h50
  3. Problème avec la fonction rechdom dans un état
    Par ustilago dans le forum IHM
    Réponses: 4
    Dernier message: 30/08/2006, 16h06
  4. Réponses: 2
    Dernier message: 03/04/2006, 19h38
  5. [SQL] Traitement de plusieurs requêtes .SQL dans un script PHP?
    Par M4x dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 19/03/2006, 20h59

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