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.