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