【发布时间】: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