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

Sql*Plus Oracle Discussion :

Probleme avec script bash SQLplus et Crontab


Sujet :

Sql*Plus Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9
    Par défaut Probleme avec script bash SQLplus et Crontab
    Bonjour,

    (je ne sais pas vraiment si cette question est d'ordre commande shell ou SQL plus)
    J'ai un probleme avec un script bash qui fonctionne quand je le lance manuellement mais pas avec crontab. (j'ai regardé dans ce forum et celui des commandes shell linux mais je n'y ai pas trouvé de solution).

    J'ai fait un petit script qui detecte la présence d'un ou plusieur fichiers dans le repertoire inbox et qui va lancer une procedure PL-SQL stockée dans une base Oracle (11g). J'ai testé ceci sur une VM Oracle Linux avec un serveur en local.
    Voici le script (certainement perfectible, je suis assez novice en la matière):
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    # !/bin/bash -x
    # Detect files in a folder and launch a SQL stored procedure
     
    #set -x
     
    #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    #Variables
     
    #stored PL-SQL procedure
    sqlprocname=dummy_load_irt_data
    # Directories
    irtdir=/home/oracle/irt
    inbox=$irtdir/inbox/
    archive=$irtdir/archive/
    badfile=$irtdir/badfile/
    logfile=$irtdir/script/irt.log
    sqllogfile=$irtdir/script/SQLLog.log
    sqlplusdir=/home/oracle/app/oracle/product/11.2.0/dbhome_2/bin
    #Database User name and password
    userid=irt
    userpwd=irt
     
    #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     
    execdate=$(date +%d-%m-%Y_%H%M%S)
    echo "Execution date" $execdate >>$logfile
     
     
    function CallProc
    {
    $sqlplusdir/sqlplus -s ${userid}/${userpwd} <<ENDSQL  >$sqllogfile
    whenever oserror exit 99
    whenever sqlerror exit 98
     
    	 declare
    		VLoadingDate varchar2(60);
    		VFileName varchar2(60);
    		VStatus varchar2(60);
    		VFileDate varchar2(60);
    	 begin
    		VLoadingDate := '$2';
    		VFileName := '$3';
    		VStatus := '$4';
    		VFileDate := '$5';
    		$1(VLoadingDate,VFileName,VStatus,VFileDate); 
    	 end;  
    /
    	 exit
    ENDSQL
    }
     
    #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     
    #Check that folder is not empty
    if [ $(ls -1A $inbox | wc -l) -eq 0 ]
    then
    	#Folder is empty
    	echo $execdate "Inbox Folder is empty" >>$logfile
    else
    	until [ $(ls -1A $inbox | wc -l) -eq 0 ]
    	do 
    		execdate=$(date +%d-%m-%Y_%H%M%S)
    		#read file attributes
    		filename=$(ls $inbox | head -n1)
    		filedate=$(stat $inbox$filename -c %y)
    		filetime=$(echo ${filedate:10:10})
    		filedate=$(echo ${filedate:0:10})
    		#execute sql script
    		CallProc $sqlprocname $execdate $filename 'OK' $filedate
    		errorcode=$?
    		if [ $errorcode -eq 0 ]
    		then
    			#Write a line with the result in log and
    			#move file to Archive directory if result is OK
    			mv $inbox$filename $archive
    			echo $execdate "Filename :" $filename "File Date :" $filedate "--> Import successful" >>$logfile
    		else
    			#Write a line with the result in log and
    			# Move to BadFile directory if result is not OK
    			mv $inbox$filename $badfile
    			#Move and rename the SQLLog file to get tace of the sql error
    			mv $sqllogfile $badfile$filename.err
    			echo $execdate "Filename :" $filename "File Date :" $filedate "--> Import Failed: "$errorcode >>$logfile
    		fi
    	done
    fi
     
    echo "--- End execution --- " >>$logfile
    Quand je le lance manuellement il s'execute normalement et me donne les résultats attendus, la procedure stockée est exécutée, les fichiers sont déplacés vers "archive" ou "Badfile" et j'ai une trace dans ma log).
    Quand je crée une ligne dans la crontab
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    */2 * * * * /home/oracle/irt/script/monitor.sh >>/home/oracle/irt/script/cron.log 2>&1
    J'obtiens le message suivant dans la cron.log:
    Error 6 initializing SQL*Plus
    SP2-0667: Message file sp1<lang>.msb not found
    SP2-0750: You may need to set ORACLE_HOME to your Oracle software directory
    J'ai verifié que la variable ORACLE_HOME existe:
    ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
    et que dans le repertoire "/home/oracle/app/oracle/product/11.2.0/dbhome_2/sqlplus/mesg/" j'ai bien des fichiers .msb et notamment sp1us.msb ce qui correspond a mon NLS language.

    Je ne comprend pas pourquoi mon script fonctionne manuellement mais pas avec cron (j'ai essayé la cron de mon user et celle de root avec le même résultat)
    Je dois certainement manquer un point basique mais je ne vois pas lequel....
    Si l'un d'entre vous à une idée?
    Merci d'avance.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 133
    Par défaut
    Est-ce que la variable ORACLE_HOME est bien définie lorsque le script est exécuté par cron ?
    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.

  3. #3
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    J'ai verifié que la variable ORACLE_HOME existe:
    Si c'est dans le .profile, il n'est pas lu par le cron.

    Le mieux est de rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
    dans le script.

    Cordialement,
    Franck.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9
    Par défaut
    Merci beaucoup Al1_24 et Pachot,
    Bonjour,

    Citation:
    J'ai verifié que la variable ORACLE_HOME existe:

    Si c'est dans le .profile, il n'est pas lu par le cron.
    En fait j'ai un peu de mal à savoir ou sont définies mes variables d'environment... Dans mon home, j'ai un fichier .bashrc et un .bash_profile qui font appel a un /etc/bashrc.... je vais devoir réviser un peu mes bases.

    Ma supposition qu'ORACLE_HOME existait reposait sur l'affichage d'un env | sort

    J'ai du déclarer d'autres variables dans mon script, comme PATH et ORACLE_SID mais maintenant cela semble fonctionner, je vais effectuer la manoeuvre inverse pour verifier que toutes ces variables "locales" sont bien nécéssaires.

    En tout cas j'ai la solution, merci beaucoup

  5. #5
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Ce qui est lançé par cron n'est pas dans votre environnement de login (.bash_profile, .bashrc,...).
    'env' montre les variables de ton process (un shell bash qui a exécuté .bashrc lorsqu'il s'est lançé)
    Mais cron ne fait pas de login, il ne passe pas par tout ça.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9
    Par défaut
    Oui, c'est ce que je suis en train de réaliser, pour moi cron lançait des actions "en mon nom". Je vais me pencher un peu plus sur la question histoire de mieux comprendre.
    Mais en tout cas mon probleme immédiat est résolu:
    ccool:

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

Discussions similaires

  1. Problème avec script bash
    Par jejerome dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 26/11/2006, 22h32
  2. probleme avec script
    Par tostos94 dans le forum Windows
    Réponses: 1
    Dernier message: 24/06/2006, 14h09
  3. Probleme avec <script src=
    Par MicroPuce dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 16/05/2006, 15h12
  4. Probleme avec mon bash script
    Par spynux dans le forum Linux
    Réponses: 1
    Dernier message: 30/03/2006, 09h21
  5. probleme avec script perl grab_tv_fr.pl
    Par ZiMo dans le forum Langage
    Réponses: 6
    Dernier message: 30/11/2005, 17h12

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