1つのOracleインスタンスのみが実行されることを保証するスクリプト

1つのOracleインスタンスのみが実行されることを保証するスクリプト

私はOracle DBAであり、今日発生した奇妙な状況を理解するためのアドバイスが必要です。

'Already its running'Tivoli スケジューラーのため、DBA 操作の 1 つが失敗しました。しかしそうではありません。私は一度実行しましたが、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:0 /tmp/dba_audit_cleanup.sh

3) Oracle 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。 2番目のプロセスは、dba_audit_cleanup.shoracleユーザーとして実際のコマンドを実行するプロセスです。問題は、スクリプト自体内で実行されているプロセスを確認することです。スクリプトを書いた方法では、常に2つのプロセスを選択するので、常にこのように失敗します。最善の方法は、スクリプトの先頭にPIDファイルまたは他の形式のフラグファイルを作成し、スクリプト中にそれらを確認し、何らかの方法で検証を実行するプロセスが実行される必要があるプロセスであることを確認してから削除することです。スクリプトの終わりに。または、pidファイルを確認し、見つかった場合は終了し、見つからない場合は作成し、スクリプトの最後から削除します。

関連情報