杀死shell进程和子进程oracle进程

时间:2013-01-19 17:33:30

标签: oracle shell process background kill

从我的shell脚本中,我使用kill命令杀死我的后台函数进程。此函数使用sqlplus调用SQL过程:

func_foo(){
retval=`sqlplus -s $USER_NAME/$PWD <<EOF
        set pages 0 lines 120 trimout on trimspool on tab off echo off verify off feed off serverout on
        exec pkg_xyz.proc_abc();
        exit;
        EOF`
}


func_foo&
pid_func_foo=$!

sleep 5

kill $pid_func_foo 2>/dev/null
wait $pid_func_foo 2>/dev/null

该方法的问题在于即使我的​​函数进程被终止,Oracle进程也会继续运行。 Oracle进程没有被杀死。我是oracle的新手,我不知道如何处理这种情况。请告诉我如何处理这种情况的提示。

2 个答案:

答案 0 :(得分:2)

杀死Oracle进程是个坏主意。尝试以另一种方式解决您的问题。

  1. 使用dbms_scheduler将您的过程作为作业运行。您可以在需要时通过调用dbms_scheduler.stop_job('job name')来停止作业。

  2. 构建您的过程,以便以编程方式停止。我已经构建了一些运行很长时间的程序。每隔一段时间,该过程就会检查一个名为“Status”的表,该表只包含一行。如果状态为“ok”,则运行。如果我将行更改为其他内容,则过程会看到并停止。

答案 1 :(得分:0)

在交互式SQL * Plus会话中点击control-c会终止正在运行的命令,生成信息性的ORA-01013消息,并让您离开SQL * Plus提示符 - Oracle进程仍处于活动状态但处于空闲状态(可能过于简单化)有点)。

您可以通过发送中断信号而不是默认终止信号来获得等效效果。根据您的操作系统和shell,这可能略有不同,但通常类似于:

kill -int $pid_func_foo 2>/dev/null

这仍应生成ORA-01013,sqlplus进程将继续。但是,由于“here here”中的下一个语句是exit,它仍然会停止并且会比终止信号更自然地执行,并且Oracle会话将正常清除,从而删除Oracle进程。 (如果您的程序正在进行任何插入或更新,则在事务回滚时可能仍会有延迟)。

我不确定这是管理执行时间限制的一种特别好的方法;工作控制或资源管理可能是更好的方法。