使用oracle PL/SQL SP在不同的Linux服务器上运行Shell脚本

使用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

我想在调用存储过程时运行Linux服务器上的shell脚本

如果脚本放在安装数据库的同一台服务器上,比如说“LinuxServerA”,下面的代码就非常有用

数据库版本:Oracle数据库12c Linux版本:Red Hat Linux 7

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”上的脚本