0

基本的に sqlplus を呼び出して結果を変数 X に入れる単純な Linux スクリプトを作成しました。次に X を分析し、syslog メッセージを送信する必要があるかどうかを判断します。

コマンドラインから「oracle」として実行すると、スクリプトは完全に機能します。ただし、「oracle」として crontab を使用してジョブに追加すると、X がいっぱいになりません。

私は間違っている可能性がありますが、問題はcronがサイレントモードで実行されるため、Xが実際にはいっぱいにならないためだと思いますが、手動で実行するといっぱいになります。

これが私のcrontab -lの結果です(オラクルとして):

0,30 * * * * /scripts/isOracleUp.sh syslog

これが私の完全なスクリプトです:

#Created by: hatguy
#Created date: May 8, 2012
#File Attributes: Must be executable by "oracle"
#Description: This script is used to determine if Oracle is up
#  and running.  It does a simple select on dual to check this.    

DATE=`date`
USER=$(whoami)

if [ "$USER" != "oracle" ]; then
    #note: $0 is the full path of whatever script is being run.
    echo "You must run this as oracle.  Try \"su - oracle -c $0\" instead" 
    exit;
fi

X=`sqlplus -s '/ as sysdba'<<eof
set serveroutput on;
set feedback off;
set linesize 1000;
select count(*) as count_col from dual;
EXIT;
eof`

#This COULD be more elegant.  The issue I'm having is that I can't figure out
#which hidden characters are getting fed into X, so instead what I did was
#check the string legth (26) and checked that COUNT_COL and 1 were where I 
#expected.
if [ ${#X} -eq 26  ] && [ ${X:1:10} = "COUNT_COL" ] && [ ${X:24:3} = "1" ] ; then
    echo "Connected"
    #log to a text file that we checked and confirmed connection
    if [ "$1" == "syslog" ]; then
        echo "$DATE: Connected" >> /scripts/log/isOracleUp.log
    fi
else
    echo "Not Connected"
    echo "Details: $X"
    if [ "$1" == "syslog" ]; then
        echo "Sending this to syslog"
        echo "==========================================================" >>             /scripts/log/isOracleUp.log
        echo "$DATE: Disconnected" >> /scripts/log/isOracleUp.log
        echo "Message from sqlplus: $X" >> /scripts/log/isOracleUp.log
        /scripts/sendMessageToSyslog.sh "PROD Oracle is DOWN!!!"
        /scripts/sendMessageToSyslog.sh "PROD Details: $X"
    fi
fi

ターミナルから oracle として実行した場合の出力は次のとおりです。

Wed May  9 10:03:07 MDT 2012: Disconnected
Message from sqlplus: select count(*) as count_col from dual
*
ERROR at line 1:
ORA-01034: ORACLE not available
Process ID: 0
Session ID: 0 Serial number: 0

オラクルのcrontabジョブを実行したときのログ出力は次のとおりです。

Wed May  9 11:00:04 MDT 2012: Disconnected
Message from sqlplus:

そしてsyslogに:

PROD Details:
PROD Oracle is DOWN!!!

私は新しい Linux ユーザーであり、これが私の最初の Linux スクリプトであるため、何か助けていただければ幸いです。

ありがとう!

4

1 に答える 1

1

私の Oracle データベースのスキルはかなり限られていますが、 ORACLE_SID と ORACLE_HOME を設定する必要はありませんか?

コマンドラインからこれらの変数を確認し、cron 内でこれらの変数を設定して再試行してください。

于 2012-05-14T05:19:07.330 に答える