Почему задание на выполнение скрипта больше не работает?
В версии 12c ввели новый тип заданий EXTERNAL_SCRIPT и это работало.
Вот упрощённый воспроизводимый пример таких заданий:
var job_name varchar2 (30)
set autoprint on
declare
script varchar2 (32767) :=
'#!/usr/bin/python'||chr(10)||
'print ("<some script output>")';
begin
:job_name := dbms_scheduler.generate_job_name;
dbms_scheduler.create_job (job_name=>:job_name, job_type=>'EXTERNAL_SCRIPT',
job_action=>script, credential_name=>'oscred', enabled=>true, auto_drop=>false);
end;
/
select status, output, error#
from user_scheduler_job_run_details
where job_name = :job_name
/
STATUS OUTPUT ERROR#
------------ -------------------------------- ----------
SUCCEEDED <some script output> 0
При миграци БД на версию 19c все задания этого типа перестали выполняться. Тотже пример выше возвращает теперь ошибку:
select status, error#, errors, additional_info
from user_scheduler_job_run_details
where job_name = :job_name
/
STATUS ERROR# ERRORS ADDITIONAL_INFO
------------ ---------- ------------------ ----------------------------------------------
FAILED 10 Command not found EXTERNAL_LOG_ID="job_79389_40718",
ORA-27369: job of type EXECUTABLE failed with
exit code: No child processes
Почему возникает ошибка? Kакие есть пути решения проблемы?
Ответы (1 шт):
В актуальной версии оф. документации нет никаких изменений относительно 12c:
'EXTERNAL_SCRIPT'
This specifies that the job is an external script that uses the command shell of the computer running the job. For Windows this is cmd.exe and for UNIX based systems the sh shell, unless a different interpreter is specified by prefixing the first line of the script with #!.
Но указание интерпритатора в первой строке скрипта (shebang), либо больше не поддерживается, либо имеет место баг. Если есть договор на поддержку с Oracle, следует открыть инцедент (пока следов на устранение этой ошибки на MOS нет).
Как workaround:
Если скрипт может быть выполнен в
sh, то просто закомментировать или удалить shebang.Если скрипт не выполняется в
sh, или другой интерпретатор, например, Perl, Python, awk и т.п., то поместить тексты скриптов в файлы в определённой директории, дать ОС пользователю, соответствующего параметруcredential_name, права на их выполнение.
Вот воиспроизводимый пример
SQL> host cat script1
#!/usr/bin/python
print ("<some python output>");
var job_name varchar2 (30)
declare
script varchar2 (32767) :=
'PATH=$PATH:/home/oracle/bin'||chr(10)||
'echo "<some shell output>"' ||chr(10)||
'script1';
begin
:job_name := dbms_scheduler.generate_job_name;
dbms_scheduler.create_job (job_name=>:job_name, job_type=>'EXTERNAL_SCRIPT',
job_action=>script, credential_name=>'oscred', enabled=>true, auto_drop=>false);
end;
/
select status, output, error#
from user_scheduler_job_run_details
where job_name = :job_name
/
STATUS OUTPUT ERROR#
------------ -------------------------------- ----------
SUCCEEDED <some shell output> 0
<some python output>