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:
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:
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
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