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):
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).
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 crée une ligne dans la crontab
J'obtiens le message suivant dans la cron.log:
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'ai verifié que la variable ORACLE_HOME existe: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
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.ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
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.
Partager