【问题标题】:killing shell process and child oracle process杀死shell进程和子oracle进程
【发布时间】:2013-01-03 05:26:01
【问题描述】:

在我的 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 新手,我不确定如何处理这种情况。请向我提供有关如何处理这种情况的提示。

【问题讨论】:

  • 您拥有并且可以杀死 sqlplus 进程,但是当它连接到数据库时(通常)会生成一个 Oracle 拥有的进程,您无法杀死它。你为什么要杀它?您是否尝试将程序执行时间限制为 5 秒?
  • 你真的不能杀死Oracle进程@Alex。在 Oracle 用户工作时连接 grep sqlplus | grep -v grep | awk '{print kill "$1" }' | sh 之类的东西会不会(用于杀死所有 SQL*Plus 进程 - OP 可能应该更具辨别力)?虽然,apparently I'm evil 使用 grep 管道进入 awk :-)!
  • 这只是我为简化问题而创建的示例。只是在某些情况下,我确实希望函数 func_foo 的功能被中止。所以我正在杀死它的进程。但不确定如何杀死 oracle 产生的进程。
  • @Ben - 当然,如果您以 Oracle 身份连接;我假设该脚本将在另一个帐户下运行,因此在其中您无法杀死 Oracle 进程 - 无论如何都没有 sudo 或其他 setuid 程序。我还宁愿alter system kill 来自数据库内的会话,尤其是因为您可以确定正确的要杀死的会话。我想一个选项是有一个打包的过程来做到这一点,用户帐户可以调用。听起来像是自找麻烦 *8-)
  • 我观察到的是按 ctrl_c 停止由 sqlplus 进程产生的 oracles 进程。它阻止了什么?

标签: oracle shell process background kill


【解决方案1】:

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

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

  2. 构建您的过程,以便它可以通过编程方式停止。我已经建立了几个运行很长时间的程序。该过程不时地检查一个名为“Status”的表,该表仅包含一行。如果状态为“ok”,则继续运行。如果我将行更改为其他内容,程序会看到并停止。

【讨论】:

    【解决方案2】:

    在交互式 SQL*Plus 会话中点击 control-c 会终止正在运行的命令,生成一条信息性 ORA-01013 消息,并将您留在 SQL*Plus 提示符处 - Oracle 进程仍然存在但处于空闲状态(可能有些过于简单化了) .

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

    kill -int $pid_func_foo 2>/dev/null
    

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

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

    【讨论】:

      猜你喜欢
      • 2012-09-08
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多