确保只有一个 Oracle 实例正在运行的脚本

确保只有一个 Oracle 实例正在运行的脚本

我是一名 Oracle DBA,需要建议来理解今天出现的奇怪情况。

我们的一项 DBA 工作因'Already its running'Tivoli 调度程序而失败。然而事实并非如此。运行一次但不确定为什么 UNIX 同时创建 2 个进程并导致作业失败。

我的分析:

从我的 UNIX id 运行如下作业,它确实创建了 2 个进程。不确定为什么要创建它(OS -AIX 6.1)。

$sudo su - oracle -c /tmp/dba_audit_cleanup.sh

1) pandas5 20578520 9109824 0 12:08:03 pts/4 0:00 sudo su - oracle -c /tmp/dba_audit_cleanup.sh
2) oracle 36241502 20578520 0 12:08:03 pts/4 0:00 /bin/ksh /tmp/dba_audit_cleanup.sh

3)甲骨文 28180512 36241502 0 12:08:12 点/4 0:00 grep dba_audit_cleanup.sh

代码:

IsJobRunning()
{
if [[ $DEBUG -ne 0 ]]
then
set -x
fi

if [ `ps -ef | grep $PROGNAME | grep -v grep | wc -l` -ne 1 ]
then
return 1
else
return 0
fi
}

# MAIN
################################################################################

if IsJobRunning
then
continue
else
print " $PROGNAME is already running on this node "
exit 0

答案1

您所看到的行为是正确的。第一个进程是 拥有的进程pandas5,运行该sudo su - oracle部件。第二个进程是以dba_audit_cleanup.shoracle 用户身份运行实际命令的进程。问题在于检查脚本本身内正在运行的进程 - 按照您编写脚本的方式,它总是会拾取两个进程,因此总是会以这种方式失败。最好的办法是在脚本开头编写一个 PID 文件或某种其他形式的标志文件,在脚本过程中检查它,并以某种方式确保执行检查的进程是应该运行的进程,然后将其删除在脚本的末尾。或者,检查 pid 文件,如果找到则退出,如果未找到则创建它,然后在脚本末尾将其删除。

相关内容