6f429244e498457b8400e72e4af683b0 Alberto Blog: Scheduled Job Running Shell Script Fails With ORA-27369

venerdì 30 agosto 2013

Scheduled Job Running Shell Script Fails With ORA-27369

Nei giorni scorsi mi sono trovato a combattere con questo errore ORA-27369:  Operation not permitted, durante una schedulazione di un job.
La versione di Oracle è la 11GR2.
Ho voluto riportare tutti gli scripts che venivano lanciati attraverso il crontab , nello scheduler di Oracle.
Quindi per prima cosa:

BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name => 'TEST',
program_action => '/home/oracle/test.sh',
program_type => 'EXECUTABLE',
comments => 'test');
END;
/


BEGIN
DBMS_SCHEDULER.CREATE_SCHEDULE(
schedule_name => 'TEST_schedule',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=DAILY; BYHOUR=20',
comments => 'Run 20 P.M.');
END;
/

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'JOB_TEST',
program_name => 'TEST',
schedule_name => 'TEST_schedule',
enabled=> true,
auto_drop=> false
);
END;
/

Ho verificato nel log dello specifico job e ho trovato l'errore ORA-27369 con la descrizione STANDARD_ERROR="standard in must be a tty"
Questo dipende dal fatto che gli script che venivano eseguiti con il crontab  essendo lanciati con root avevano il comando su - oracle -c "home/oracle/test.sh" e questo generava questo specifico errore, mentre se vengono lanciati  mediante lo scheduler di Oracle vengono eseguiti con l'utente oracle (impostato tramite il file externaljob.ora), quindi ho provveduto ad eliminare il comando su - oracle nello script test.sh.
Ho provato a rischedulare il job  e ancora mi ritornava l'errore ORA-27369:  questa volta con la descrizione Operation not permitted.
Eseguendo lo script dalla shell del sistema operativo, funzionava.
Ed è quì che ho focalizzato la mia indagine, visto che l'utente che lancia il job è oracle, ho pensato che caricasse da solo le variabili di ambiente dell'utente, prendendole dal profilo del OS, nel mio caso Oracle Enterprise Linux 6.3.
Sbagliato.
Il problema è che non caricava le variabili del profilo dell'utente, bisogna inserirle dentro lo script test.sh..
Dopo aver inserito infatti le variabili (le stesse del file .bash_profile) come per esempio:

ORACLE_SID=test1; export ORACLE_SID
ORACLE_UNQNAME=test; export ORACLE_UNQNAME
ORACLE_BASE=/u02/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1; export ORACLE_HOME

LD_LIBRARY_PATH=$ORACLE_HOME/lib
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/oracm/lib
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib
export LD_LIBRARY_PATH

CLASSPATH=$ORACLE_HOME/JRE
CLASSPATH=${CLASSPATH}:$ORACLE_HOME/jlib
CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib
CLASSPATH=${CLASSPATH}:$ORACLE_HOME/network/jlib
export CLASSPATH

PATH=$PATH:$HOME/bin
PATH=$PATH:$ORACLE_HOME/bin

export PATH


Lo script lanciato attraverso lo schedulatore, ha cominciato a funzionare bene.

P.S.: Prima di effettuare i testi ho provveduto ad impostare e modificare così i seguenti file:


- rdbms/admin/externaljob.ora: deve avere l'owner root:oraclegroup ed i permessi  644 (rw-r--r--) all'interno deve essere configurato con
run_user = oracle
run_group = dba


- bin/extjob: deve avere come proprietario root:oraclegroup ed i permessi 4750 (-rwsr-x---)

- bin/extjobo permessi 755 (rwxr-xr-x) con proprietario oracle:oraclegroup

Nessun commento:

Posta un commento