하나의 Oracle 인스턴스만 실행되도록 보장하는 스크립트

하나의 Oracle 인스턴스만 실행되도록 보장하는 스크립트

저는 Oracle DBA이며 오늘 발생한 이상한 상황을 이해하기 위한 조언이 필요합니다.

'Already its running'Tivoli 스케줄러로 인해 DBA 작업 중 하나가 실패했습니다. 그러나 그렇지 않습니다. 한 번 실행했지만 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 pm/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 파일을 확인하고, 발견되면 종료하고, 발견되지 않으면 생성한 다음 스크립트 끝에서 삭제합니다.

관련 정보