使用oracle PL/SQL SP在不同的Linux服务器上运行Shell脚本
我想在调用存储过程时运行Linux服务器上的shell脚本 如果脚本放在安装数据库的同一台服务器上,比如说“LinuxServerA”,下面的代码就非常有用 数据库版本:Oracle数据库12c Linux版本:Red Hat Linux 7使用oracle PL/SQL SP在不同的Linux服务器上运行Shell脚本,linux,oracle,shell,plsql,dbms-scheduler,Linux,Oracle,Shell,Plsql,Dbms Scheduler,我想在调用存储过程时运行Linux服务器上的shell脚本 如果脚本放在安装数据库的同一台服务器上,比如说“LinuxServerA”,下面的代码就非常有用 数据库版本:Oracle数据库12c Linux版本:Red Hat Linux 7 begin dbms_scheduler.create_credential ( credential_name => 'my_credential', username => 'user', pa
begin
dbms_scheduler.create_credential
(
credential_name => 'my_credential',
username => 'user',
password => 'pass'
);
end;
/
create or replace procedure RunShell
as
begin
dbms_scheduler.create_job
(
job_name => 'shell_scripts_job',
job_type => 'executable',
number_of_arguments => 1,
job_action => '/usr/bin/sh',
auto_drop => true,
credential_name => 'my_credential'
);
dbms_scheduler.set_job_argument_value(job_name=>'shell_scripts_job', argument_position=>1, argument_value=>'/u01/Script.sh');
dbms_scheduler.enable('shell_scripts_job');
dbms_scheduler.run_job(job_name=>'shell_scripts_job');
END;
/
EXECUTE RunShell;
问题是,我的数据库安装在“LinuxServerA”上,我想要运行的shell脚本安装在“LinuxServerB”上
此脚本执行一些必须在“Linux服务器B”中完成的操作。其主要功能之一是启动/停止驻留在“Linux服务器B”上的另一个应用程序
如何实现这一点?您可以在远程计算机上创建NFS共享,然后在本地计算机上装载该共享。共享的远程目录可以像本地目录一样被引用 例如,如果您在远程目录“/u01”上创建一个共享,并将该共享称为“远程脚本”,您将在/mnt/remote\u scripts上挂载该共享 代码中的参数_值将是
argument_value=>'/remote_scripts/Script.sh'
设置共享和权限需要考虑更多的细节,但原则上这是可行的
下面的页面提供了一个很好的设置概要,但是让您的系统管理员参与进来,因为他们知道您的网络。()将shell脚本从“Linux服务器B”复制到“Linux服务器A”。作为作业的一部分,您能否从A到B使用ssh远程调用脚本?(意味着已经配置了密钥访问,没有密码短语…@Littlefoot:但是在复制之后,PL/SQL存储的Proc RunShell如何知道在“Linux服务器B”上运行/u01/Script.sh,而不是在“Linux服务器A”上运行/u01/Script.sh?创建指向脚本位置的NFS共享,并在调用它时引用该共享。正如您所说:PL/SQL过程运行位于数据库服务器(即“Linux服务器a”)上的脚本。因此,如果您将脚本从“LinuxServerB”复制到“LinuxServerA”,您的PL/SQL代码将可以访问它并执行它。正如您所说:“如果脚本放在安装数据库的同一台服务器上,代码就像一个符咒一样工作”。脚本将存在于远程服务器(B)上,但仍将在本地服务器(a)上执行;因此它不能在远程服务器上执行操作(除非它们直接影响NFS共享上的文件);它无法启动/停止另一个驻留在远程服务器上的应用程序-可以吗?@AlexPoole-ahhh,我误解了。它可能会变得有点“笨重”。听起来“ssh”将是答案。公平地说,当你回答*8-)感谢大家的帮助,我认为现在唯一的办法是让我的存储过程在“Linux服务器a”上运行一个脚本,这将反过来对“Linux服务器B”执行ssh,并调用“Linux服务器B”上的脚本