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 :

nohup et <<EOF


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Kazevil
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2006
    Messages : 105
    Par défaut nohup et <<EOF
    Bonsoir à tous,

    je me casse la tête depuis cet après-midi sur un soucis de commande nohup &.

    Je veux/dois lancer une série de commandes SQL dans un script KSH et le faire tourner en tâche de fond pour que le script continu. J'utilise donc la commande nohup et le &. Le nohup fonctionne bien mais je ne récupère pas la main car le & n'est pas pris

    J'ai fait un truc de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
    while [ $i -le $proc ]; do
    nohup sqlplus /nolog <<EOF
    connect / as sysdba
    @Tb_Mig_reorg.sql $i
    EOF &
     
    (( i = i + 1 ))
    done
    ...
    L'idée, comme vous pouvez le voir est de lancer plusieurs fois le même script PL/SQL en parallèle. Comme chacun "instance" du scripts va durer plusieurs heures, si mon script ne reprend pas la main, ma boucle va faire un tour toutes les X heures au lieu de lancer les "instances" script en parallèle.

    Si je ne mets pas le & à la fin, je me retrouve avec mes process qui tournent en série et si je le rajoute j'ai une erreur.

    Je serais preneur de toute suggestion...

    Merci d'avance

    Kaz

  2. #2
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    tu peux essayer comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while [ $i -le $proc ]; do
    nohup (sqlplus /nolog <<EOF
    connect / as sysdba
    @Tb_Mig_reorg.sql $i
    EOF) &
    
    (( i = i + 1 ))
    done
    les parenthèses devrais te lancer sqlplus dans un sous shell et le & devrait te le mettre ne background si je ne me plante pas.

  3. #3
    Membre éprouvé Avatar de Kazevil
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2006
    Messages : 105
    Par défaut
    Bonsoir,

    merci pour l'astuce, malheureusement le nohup n'aime pas la ( et met une erreur "d'Unexpected caracter"

    Une autre idée

    Kaz

  4. #4
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    passe toi du nohup, pas indispensable je pense. ou alors met un $ devant la parenthèse ouvrante.

    et si cela ne marche toujours pas coupe ton script en deux


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while [ $i -le $proc ]; do
    nohup  mysqlscrip.ksh $i &
     
    (( i = i + 1 ))
    done
    et mysqlscrip.ksh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sqlplus /nolog <<EOF
    connect / as sysdba
    @Tb_Mig_reorg.sql $1
    EOF

  5. #5
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonsoir,

    Je ne peux reproduire exactement le comportement du script fourni, mais j'ai un script qui marche avec la structure suivante:
    Script toto:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/ksh
    
    i_max=10
    for (( i=1; i<i_max; i++ ))
    do
      ./titi $i &
    done
    echo "$0 fini"
    Script titi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/bin/ksh
     
    sleep 2
    echo "$0 $1 fini"
    Et j'obtiens le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ ./toto
    ./toto fini
    $ ./titi 1 fini
    ./titi 2 fini
    ./titi 3 fini
    ./titi 4 fini
    ./titi 5 fini
    ./titi 6 fini
    ./titi 7 fini
    ./titi 9 fini
    ./titi 8 fini
    Cela veut bien dire que le script toto est exécuté et fini avant que les scripts titi terminent. De plus, l'ordre non strict (9 avant 8) provient de l'exécution en parallèle des scripts titi.

    Donc, si j'ai bien compris le problème, il suffit d'ajouter l'esperluète & après la commande à exécuter, c'est tout.

  6. #6
    Membre éprouvé Avatar de Kazevil
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2006
    Messages : 105
    Par défaut
    Pour la séparation du script en 2, ça c'est bon. J'en ai déjà une version de prêtre.
    Le truc c'est de mon cas ça ne m'arrange pas des masses. Et puis ma curiosité perso est aussi piquée

    Pour le coup du $ j'ai essayé, mais après un timeout j'ai message d'erreur "No such file found"

    Mon problème n'est pas le nohup en fait, lui tout seul fonctionne bien et me permet d'éviter que les process ne plantent si je pers ma connexion SSH.

    Le vrai soucis est que le & ne fonctionne pas après la fin du bloc EOF.

  7. #7
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    on arrive au même résultat couper le script en deux

  8. #8
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    et si tu fais un fonction, ksh le permet autant l'utiliser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    myfunc() {
    sqlplus /nolog <<EOF
    connect / as sysdba
    @Tb_Mig_reorg.sql $1
    EOF
    }
     
    while [ $i -le $proc ]; do
    myfunc $i &
     
    (( i = i + 1 ))
    done
    et hop plus qu'un seul script

    autrement petit site indispensable quand on se pose des question de scripts
    http://www.versageek.com/ksh_munix.html

    la syntaxe est a vérifier pas de shell sous la main

  9. #9
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    S'il ne s'agit que de placer l'esperluète & sur la commande, essaie ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    commande << EOF &
    here-document
    EOF

  10. #10
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    je pense que ça marche, je l'avais déjà vu il y'a longtemps mais ma mémoire étant ce qu'elle est

  11. #11
    Membre éprouvé Avatar de Kazevil
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2006
    Messages : 105
    Par défaut
    MERCI à tous!!

    Les 2 solutions fonctionnent

    En plus la première, j'aurais du y penser vu que j'utilise d'autres fonction dans mon script.
    Je me suis coller une bonne pour me remettre les idées en place.

    Au fait bien sympa le site en lien...

    Encore merci

    A++

    Kaz

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

Discussions similaires

  1. equivalent EOF
    Par $grm$ dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 21/05/2004, 16h48
  2. Problème avec Do while rs.EOF
    Par lauraned dans le forum ASP
    Réponses: 12
    Dernier message: 21/05/2004, 12h00
  3. Fonction If avec rs.eof problème
    Par M1000 dans le forum ASP
    Réponses: 5
    Dernier message: 24/03/2004, 17h10
  4. modification de fichier EOF
    Par scorbo dans le forum C
    Réponses: 9
    Dernier message: 28/11/2003, 11h35
  5. RecordSet en EOF
    Par jfphan dans le forum ASP
    Réponses: 3
    Dernier message: 06/11/2003, 16h47

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