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 :

Utilisation simultanée d'un script ksh


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 50
    Par défaut Utilisation simultanée d'un script ksh
    Bonjour,

    J'ai créé dans le cadre de mes tâches quotidiennes au travail un script permettant de faire des exports de tables (.dmp).

    Ma question est la suivante, comment est-il possible de l'améliorer afin que plusieurs personnes puissent l'utiliser en même temps?

    Le 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    #!/bin/ksh
    #==============================================================================
    #---------------+--------------------------------------------------------------
    #       HISTO   |   Date   | Vers | Auteur | Libelle
    #               |----------+------+--------+-----------------------------------
    #               | 08/03/13 | 1.00 |  MGO   | 
    #               |          |      |    	   | 
    #               |          |      |        |
    #==============================================================================
    #=== Pré-requis ===#
    rm -f export_table.lst
    touch export_table.lst 
     
    echo "Entrer le nom de la demande de service ou du changement : "
    read nom_dds
    mkdir $nom_dds ; chmod 777 $nom_dds
     
     
    #=== Récupération du schéma ===#
    nom_schema=0
    until ! [[ $nom_schema = ?([-+])+([0-9]) ]]
    do
    	echo "Entrer le nom du schéma : "
    	read nom_schema
    	if [[ $nom_schema = ?([-+])+([0-9]) ]]
    		then
    		echo "La saisie est incorrecte !!"
    	fi
    done
     
     
    #=== Récupération de l'instance ===#	
    nom_instance=0
    until ! [[ $nom_instance = ?([-+])+([0-9]) ]]
    do
    	echo "Entrer le nom de l'instance : "
    	read nom_instance
    	if [[ $nom_instance = ?([-+])+([0-9]) ]]
    		then
    		echo "La saisie est incorrecte !!"
    	fi
    done
     
     
    #=== Récupération du nombre de table & incrémentation des tables dans le fichier export_table.lst ===#	
    nombre_table=0
    until [[ "$nombre_table" > 0 ]]
    do
    	echo "Entrer le nombre de table(s) à exporter : "
    	read nombre_table	
    	if ! [[ "$nombre_table" > 0 ]]
    		then
    		echo "La saisie est incorrecte !!"	
    	fi	
    done
    while [[ $nombre_table -ge 1 ]]
    do
    	echo "Entrer le nom de la table : "
    	read nom_table_saisie
    	echo "$nom_table_saisie" >> export_table.lst
    	(( nombre_table=nombre_table-1 ))
    done
     
     
    #=== Extraction des tables & compression des données ===#
    for nom_table in `cat export_table.lst`
    do
    	expdp system/manager@$nom_instance tables=$nom_schema.$nom_table DIRECTORY=DIR_DP DUMPFILE=expdp$nom_schema_$nom_table.dmp logfile=expdp$nom_schema_$nom_table.log
    	gzip expdp$nom_schema_$nom_table.dmp
    	mv expdp$nom_schema_$nom_table.dmp.gz /travail/$LT/exports/$nom_instance/export/$nom_dds/
    	mv expdp$nom_schema_$nom_table.log /travail/$LT/exports/$nom_instance/export/$nom_dds/
    	chmod 755 /travail/$LT/exports/$nom_instance/export/$nom_dds/*
    	sleep 2
    	echo "======================== Fin $nom_table ========================"
    done
    Merci par avance
    Matthieu

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

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

    d'abord, je n'irai pas cherché un fichier zippé.
    tu peux le poster ici entre balise codes (bouton #).
    euh, il fait combien de lignes ?

    ensuite, pourquoi cela poserait des problèmes que le script soit utilisé par plusieurs utilisateurs en même temps ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 50
    Par défaut
    Cela pose problème car le contenu des variables sont saisi par l'utilisateur lui-même et plusieurs utilisateurs saisissent en même temps les variable seront faussées et le résultat attendu incorrect.

    Je précise que je débute en scripting. soyez indulgent

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 652
    Par défaut
    des variables sont saisi par l'utilisateur lui-même et plusieurs utilisateurs saisissent en même temps les variable seront faussées et le résultat attendu incorrect.
    normalement, non : le script est exécuté dans l'environnement de chaque utilisateur.
    si, dans mon environnement, j'assigne "bla bla" à la variable var, alors, dans ton environnement, $var n'existe pas !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 50
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    normalement, non : le script est exécuté dans l'environnement de chaque utilisateur.
    si, dans mon environnement, j'assigne "bla bla" à la variable var, alors, dans ton environnement, $var n'existe pas !
    En fait pour que le script fonctionne, il faut le lancer en tant que "oradba". Ce user peut dans les faits être utilisé par plusieurs personnes en même temps.

    Voila pourquoi cela pose problème.

  6. #6
    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
    Oui, mais quel problème cela pose-t-il exactement?

  7. #7
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    Citation Envoyé par matthieu44 Voir le message
    En fait pour que le script fonctionne, il faut le lancer en tant que "oradba". Ce user peut dans les faits être utilisé par plusieurs personnes en même temps.
    Pourquoi ne pas laisser les utilisateurs en tant qu'eux-même et les ajouter au groupe oradba (d'où ils pourraient lancer le script) ? Ainsi, en créant le répertoire dans ~/tmp/ , il n'y aura pas de chevauchement, ni écrasement.

    Si tu tiens a ce que tout le monde se mette au même endroit et appelle le dossier de la même façon, il n'y a pas de miracle, cela ne marchera pas.

    Le plus simple est de tester $nom_dds pour voir s'il existe et considérer la réponse positive comme une saisie incorrecte. Mais j'imagine que tu as déjà essayé...
    Genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     if [ -e ~/home ]
    then 
       echo oui
    else 
       echo non
    fi

  8. #8
    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 matthieu44 Voir le message
    Ma question est la suivante, comment est-il possible de l'améliorer afin que plusieurs personnes puissent l'utiliser en même temps?

    Le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/ksh
    rm -f export_table.lst
    touch export_table.lst 
    ...
    ... > export_table.lst
    ...
    En fait, tout le code utilise un fichier temporaire unique nommé en l'occurrence "export_table.lst" (dans le répertoire où le script est lancé).

    De cette manière, plusieurs utilisateurs peuvent lancer simultanément ce script sans collision à condition de le faire à partir de répertoires différents, ce qui n'est pas complètement satisfaisant.

    La "bonne" manière de faire (à mon sens) est de créer un vrai fichier temporaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/ksh
    tmp_file=$(mktemp "/tmp/export_table.lst_XXXXXX")
    if [ $? -ne 0 ] ; then echo "tmp impossible" 1>&2 ; exit 1 ; fi
    ...
    ... > "${tmp_file}"
    ...
    rm -rf "${tmp_file}" # à protéger par un trap...
    Si la commande mktemp n'est pas disponible, on peut utiliser le classique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tmp_file=/tmp/export_table.lst_$$

  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
    Bonjour,

    Pour utiliser le script en parallèle sans problème, on peut éviter les fichiers qui sont communs à tous les utilisateurs et utiliser les variables en mémoire qui restent privées.

    J'ai fait des modifications et le résultat me semble pas trop mal (juste mon avis).
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #!/bin/ksh
     
    ################
    # initialisation
    ################
    typeset reponse
    typeset -a tables
     
    ####################
    function lire_nombre
    ####################
    # $1: message à afficher
    #-------------------
    {
      nombre_ok=""
      while [[ $nombre_ok == "" ]]
      do
        read reponse?"$1"
        if [[ "$reponse" == ?([-+])+([0-9]) ]]
        then
          nombre_ok="1"
        else
          echo "*** ATTENTION: saisie incorrecte ***"
        fi
      done
    }
     
    ###########
    # programme
    ###########
    # creation repertoire
    read dds?"Entrer le nom de la demande de service ou du changement : "
    mkdir $HOME/dds
     
    # lire le nom du schema
    lire_nombre "Entrer le nom du schéma : "
    schema=$reponse
     
    # lire le nom de l'instance
    lire_nombre "Entrer le nom de l'instance : "
    instance=$reponse
     
    # lire le nombre de tables
    taille=0
    while [[ $taille -le 0 ]]
    do
      lire_nombre "Entrer le nombre de tables : "
      taille=$reponse
    done
     
    # lire le nom des tables
    i=1
    while [[ $i -le $taille ]]
    do
      read reponse?"Entrer le nom de la table $i : "
      tables[i]=$reponse
      ((i++))
    done
     
    # extraction - compression
    for table in ${tables[*]}
    do
      # ici le code pour extraire - comprimer
    done

  10. #10
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 50
    Par défaut
    Merci pour vos réponses.

    Entre temps, j'avais déjà trouvé une partie de la solution à savoir la création d'un fichier temporaire.

    Je vais tester également les améliorations de la part de jmelyn.

  11. #11
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 50
    Par défaut

    J'ai beau chercher, j'ai l'impression que l'option -a n'existe pas ?!

    Je pense que tu voulais plutôt dire -i.

  12. #12
    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
    En ksh, la commande
    déclare une variable de type tableau indexé. Après, ça dépend de l'implémentation de ksh. Ça marche dans Arch Linux (mksh) et dans RHEL et Fedora (ksh). Mais ce n'est peut-être pas général.

    Cependant les deux lignes typeset sont optionnelles, je les ai mises pour une meilleure compréhension. Sans elles, la création des variables se fera à la première utilisation. Cela étant, Bash est tout de même plus répandu et plus puissant.

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

Discussions similaires

  1. [FLASH MX2004] Utilisation de l'action script ou pas ?
    Par vbcasimir dans le forum Flash
    Réponses: 6
    Dernier message: 06/02/2006, 14h32
  2. [Sqlplus ] Appel depuis script KSH
    Par kasiop dans le forum Oracle
    Réponses: 2
    Dernier message: 27/01/2006, 10h25
  3. Script Ksh
    Par tonymontana4192 dans le forum Linux
    Réponses: 6
    Dernier message: 20/12/2005, 10h51
  4. Execution d'un script ksh distant
    Par jool dans le forum C++
    Réponses: 2
    Dernier message: 18/03/2005, 10h10
  5. Script ksh - Valeur maximal d'un PID
    Par fidififouille dans le forum Linux
    Réponses: 7
    Dernier message: 09/08/2004, 10h10

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