명령을 성공적으로 완료한 후 어떻게 출력을 제공할 수 있나요?

명령을 성공적으로 완료한 후 어떻게 출력을 제공할 수 있나요?

아래 스크립트에 약간의 문제가 있습니다. 명령이 성공적으로 완료되면 메시지를 내보내고 싶지만 동시에 성공하지 못하면 계속 진행해야 합니다.

우리는 Oracle 서버를 보유하고 있으며 아래 데이터베이스는 3노드 rac 서버입니다. 보관하고 싶은 것은 노드 1(예: TEST11)에서 인스턴스를 종료할 때 성공적으로 완료된 명령의 출력을 표시하지 않는다는 것입니다. 그렇지 않으면 오류가 발생하므로 해당 오류를 파일에 기록하고 성공했는지 또는 오류가 발생했는지 여부를 확인하고 싶습니다.

for DBI  in TEST11 TEST21 TEST31 TEST41
do
DB=$(echo -n $DBI | head -c -1)
echo $DB
export ORACLE_SID=$DBI
export ORACLE_HOME=`grep "^${DBI}:" /etc/oratab | cut -d: -f2 -s`
$ORACLE_HOME/bin/srvctl stop instance -d $DB -i $DBI
done

모하마드 DBA에게 감사드립니다.

답변1

Bash에서는 $?이전 명령의 반환 코드를 얻습니다. 이전 명령이 성공하면 반환 코드는 0이고, 그렇지 않으면 0이 아닙니다.

아래 예에서는 성공 및 실패 조건이 포함된 문자열을 파일에서 검색합니다. 스크립트에서 이 논리를 사용할 수 있습니다.

내 스크립트 test.sh의 내용

grep "grapes" file1 > /dev/null

if [ $? -eq 0 ]
then
    echo "Success. Perform success action"
else
    echo "Failure.. Do Failure action"
fi

다음은 샘플 실행입니다.

#cat file1
apple
grapes

#sh test.sh
Success. Perform success action


#cat file1
apple

#sh test1
Failure.. Do Failure action

답변2

srvctl유용한 종료 상태가 호출 셸에 반환된다고 가정하면 if스크립트의 명령문에서 이를 사용하여 데이터베이스가 성공적으로 종료되었는지 여부에 따라 메시지를 출력할 수 있습니다.

#!/bin/bash

export ORACLE_SID ORACLE_HOME

for ORACLE_SID in TEST{1..4}1
do
        # The database name is the same as the SID,
        # but with the last character removed.
        db=${ORACLE_SID%?}

        # Get the ORACLE_HOME directory by parsing /etc/oratab.
        ORACLE_HOME=$( awk -F : '$1 == ENVIRON["ORACLE_SID"] { print $2 }' /etc/oratab )

        # Try stopping the service.
        if "$ORACLE_HOME"/bin/srvctl stop instance -db "$db" -instance "$ORACLE_SID"
        then
                # Report success.
                printf 'DB "%s" on instance "%s" stopped\n' "$db" "$ORACLE_SID"
        else
                # Report failure, log to file.
                printf 'Failed stopping DB "%s" on instance "%s"\n' "$db" "$ORACLE_SID" |
                tee -a error.log >&2
        fi
done

위 스크립트는 대부분의 스크립트를 이식 가능한 방식으로 다시 구현하고, 외부 유틸리티에 대한 불필요한 호출을 제거하고, 필요 이상으로 많은 변수를 사용하지 않으며, if서비스에 대한 성공적인 중지 메시지에 대한 정보를 출력하거나 메시지를 출력하는 명령문을 추가합니다. 서비스를 중지할 수 없다는 점에 대해. 서비스가 중단되었습니다. 서비스가 중지되지 않으면 error.log현재 디렉터리의 호출된 로그 파일 에 해당 메시지가 추가로 추가됩니다 .


/etc/oratab각 반복에서 전체 파일을 읽는 것을 피하고 대신 루프에서 파일을 구문 분석하여 흥미로운 것을 찾으면 테스트하고 ORACLE_SID, 그렇지 않으면 다음 반복으로 건너뛰는 위 스크립트의 변형입니다 . 이 if문은 첫 번째 스크립트와 동일합니다.

#!/bin/bash

export ORACLE_SID ORACLE_HOME

while IFS=: read -r ORACLE_SID ORACLE_HOME
do
        # Skip uninteresting SIDs.
        [[ $ORACLE_SID != TEST[1-4]1 ]] && continue

        db=${ORACLE_SID%?}

        if "$ORACLE_HOME"/bin/srvctl stop instance -db "$db" -instance "$ORACLE_SID"
        then
                printf 'DB "%s" on instance "%s" stopped\n' "$db" "$ORACLE_SID"
        else
                printf 'Failed stopping DB "%s" on instance "%s"\n' "$db" "$ORACLE_SID" |
                tee -a error.log >&2
        fi
done </etc/oratab

[[ $ORACLE_SID != TEST[1-4]1 ]]테스트를 다음으로 변경하여 위 스크립트에서 모든 "bash-isms"를 제거할 수 있습니다.

case $ORACLE_SID in (TEST[1-4]1) : ;; (*) continue; esac

관련 정보