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 :

Script Bash : lancement d'une commande et attendre la fin de la commande


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2017
    Messages : 29
    Par défaut Script Bash : lancement d'une commande et attendre la fin de la commande
    Bonjour,
    Comment s'assurer dans un script bash qu'une commande 1 s'exécute et que la commande 2 suivante n'est exécutée qu'après la fin réelle de la commande 1 ?
    Cdlt,

  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
    C est le fonctionnement normal du code quelque soit le langage

    tant qu il n y a pas de conditionnement liant ces commandes

    si tu veux etre dans l absolu tu peux forcer

    mais n a que peu de sens (en general)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 636
    Par défaut
    Bonjour,

    les commandes shell sont toujours exécutées l'une après l'autre, à moins que la précédente ait été placée en arrière-plan.

    « aies confiansssssse ! »
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Par défaut
    Citation Envoyé par cyrker Voir le message
    Bonjour,
    Comment s'assurer dans un script bash qu'une commande 1 s'exécute et que la commande 2 suivante n'est exécutée qu'après la fin réelle de la commande 1 ?
    Cdlt,
    Pour info, si commande 1 lance des commandes en batch, alors il se peut que commande 1 se termine avant la fin de ses sous-commandes.
    Si tu appelles "fin réelle d'une commande" la fin de toutes les sous-commandes, c'est un peu plus complexe.

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 088
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 088
    Par défaut
    Pi lancer une commande 2 sans vérifier que la commande 1 s'est correctement terminée, c't'un peu cass'gueul', nan ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 157
    Par défaut Information
    Bonjour,

    Par fois il vaut le coup d'effectuer des recherches en différentes langues, notamment en anglais, sur des moteurs de recherche ...

    En effectuent une recherche sur Google avec " bash wait for end of command before executing next " j'ai trouvé cette page:

    https://unix.stackexchange.com/quest...vious-finished

    Je me permet de copier ici cette réponse qui me semble être intéressante:

    Shell scripts will run each command sequentially, waiting for the first to finish before the next one starts. You can either join commands with ; or have them on separate lines:

    command1; command2

    or

    command1
    command2

    There is no need for ; if the commands are on separate lines. You can also choose to run the second command only if the first exited successfully. To do so, join them with &&:

    command1 && command2

    or

    command1 &&
    command2

    For more information on the various control operators available to you, see here.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Par défaut
    Citation Envoyé par Didier100 Voir le message
    Je me permet de copier ici cette réponse qui me semble être intéressante:
    Mouais...

    Shell scripts will run each command sequentially, waiting for the first to finish before the next one starts. You can either join commands with ; or have them on separate lines:

    command1; command2

    or

    command1
    command2

    There is no need for ; if the commands are on separate lines.
    Àmha la première partie n'ajoute pas grand-chose à la réponse de frp31.

    You can also choose to run the second command only if the first exited successfully. To do so, join them with &&:

    command1 && command2

    or

    command1 &&
    command2
    L'utilisateur n'a pas précisé ce qu'il appelle "fin réelle de la commande". Fin des sous-process? Fin des opérations mises en cache (écritures disque, etc.)? Fin avec succès?
    et comme il ne répond plus...

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 338
    Par défaut
    Bonjour,

    Un exemple de commande qui ne fonctionne pas tout à fait comme désiré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gvim fichier && cat fichier
    Puisque gvim rend la main sans se terminer...

  9. #9
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    chainer les deux commandes avec && n'est pas la bonne réponse, pour s'en convaincre il suffit de considérer false && echo "2e commande".
    l'énoncé parle d'exécuter la 2e commande après que la première a terminé, il n'est pas fait mention du succès de la 1ere commande, si on considère deux commandes "classiques" c'est donc le point virgule qu'il convient d'utiliser, la première réponse était la bonne frp31

    Citation Envoyé par disedorgue Voir le message
    Un exemple de commande qui ne fonctionne pas tout à fait comme désiré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gvim fichier && cat fichier
    Puisque gvim rend la main sans se terminer...
    gvim -f && cat fichier ?


    bon, plus sérieusement en général les programmes qui fork ou qui daemonize ne sont pas considérés comme des "commandes" normales, ça va soit être des services/daemons soit des interfaces graphiques etc. bref, j'imagine qu'on doit pouvoir s'en sortir en bash en jouant avec $! et wait (laissé en exercice )

  10. #10
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 181
    Par défaut
    && n'est pas la bonne solution. && permet le déclenchement conditionnel :
    commande2 n'est exécuté que si commande1 a retourné 0.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  11. #11
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par cyrker Voir le message
    Comment s'assurer dans un script bash qu'une commande 1 s'exécute et que la commande 2 suivante n'est exécutée qu'après la fin réelle de la commande 1 ?
    Voici une proposition qui répond au premier critère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    commande1="ls -l"
    commande2="date"
    command -v $commande1 || { impossible d'exécuter "$commande1" ; exit 1 ; } && $commande1 ; $commande2
    Il n'est pas possible de satisfaire de manière portable la deuxième condition car une commande peut très bien rendre la main tout en continuant à s'exécuter en tâche de fond. Dans ce cas, le processus survivant n'est plus identifiable car détaché du shell courant et de son process group. Il faut qu'un mécanisme particulier permette de tracer les forks. Sous Linux, les control-groups permettent ce style de traitement.

    Voici un script qui répond au deuxième critère en s'appuyant sur les control-groups, l'utilisateur doit être root ou avoir le droit d'utiliser les commandes cgcreate, cgclassify et cgdelete avec sudo:

    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
    commande1="xxxx"
    commande2="yyyy"
    p=$(mktemp)
    sudo cgcreate -g cpu:$p
    sudo cgclassify -g cpu:$p $$
    echo "Exécution commande 1"
    $commande1
    pid=$!
    while [ $(ps -o pid,cgroup,args | grep $(basename $p) | grep -v grep| grep -v "pid\,cgroup\,args" | wc -l) -gt 1 ]; do
            # attente fin du premier processus
            sleep 2
    done
    (sleep 10; sudo cgdelete cpu:$p)&
    echo "Exécution commande 2"
    $commande2

Discussions similaires

  1. Réponses: 8
    Dernier message: 15/05/2008, 17h41
  2. Réponses: 15
    Dernier message: 07/04/2008, 10h37
  3. scripts SQL : lancement sur une base précise
    Par ep31 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/11/2007, 08h46
  4. Réponses: 4
    Dernier message: 24/01/2007, 00h48
  5. Script bash qui ouvre une fenetre Firefox
    Par vica6a dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 14/01/2007, 18h00

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