BASH에서 변수 값을 작은따옴표로 묶습니다.

BASH에서 변수 값을 작은따옴표로 묶습니다.

에서 실행 Perl되도록 일부 스크립트를 조정하려고 합니다 .BashNagios XI

문제는 Nagios가 변수 값이 작은따옴표 사이에 도착할 것으로 예상하지만 변수를 올바르게 이스케이프할 수 없다는 것입니다.

예를 들어, 변수 및/또는 상수를 선언하는 상단 영역에는 다음이 있습니다.

status='OK'

이를 Nagios에 반환된 값으로 바꾸면 다음과 같이 배치하면 제대로 작동합니다.

output="[$status]"
output_msg="Voting disks status check succeeded"

인쇄 시 반환됩니다 [OK] Voting disks status check succeeded.

그러나 다음과 같이 실행된 명령을 기반으로 작성된 다른 변수가 있습니다.

command=`/oracle/app/grid/19300/bin/crsctl query css votedisk | grep asm`
output1=`echo $command | cut -d " " -f4`
output2=`echo $command | cut -d " " -f5`

이 스크립트를 로컬에서 실행하면 결과는 예상한 대로입니다.

[OK] Voting disks status check succeeded - (/dev/mapper/asm_ocr1) [OCR].

하지만 Nagios 서버에서 시작할 때 $output1 및 $output2 변수는 항상 비어 있습니다.

[OK] Voting disks status check succeeded -

리터럴 텍스트로 세 번째 변수를 선언하려고 하면 올바르게 표시되기 때문에 이것이 작은따옴표 때문이라는 것을 알고 있습니다.

output3='Test'
output="[$status] $output_msg - $output3

이것은 Nagios 서버에 그려집니다:

[OK] Voting disks status check succeeded - Test

$output1$output2Nagios가 해석할 수 있도록 텍스트를 작은따옴표로 묶거나 묶는 방법을 아시나요 ?

편집하다

변수의 내용을 작은따옴표로 묶어야 하는지 확인하기 위해 다음 테스트를 수행했습니다.

#Add the path that $output1 should return
test='/dev/mapper/asm_ocr1'
#Paint in the output the variable $test
output="[$status] $output_msg - $test $output1 $output2"

########

#On the Nagios server, the $test variable send correctly:
[OK] Voting disks status check succeeded - /dev/mapper/asm_ocr1 ''

편집 2

오류는 따옴표에서 발생한 것이 아니라 Nagios와 DB를 실행하는 노드의 통신에서 발생하는 것으로 나타났습니다.

지금까지의 전체 스크립트는 다음과 같습니다.

. /home/oracle/.profile_RAC
ORACLE_HOME=/oracle/app/grid/19300
ORACLE_BASE=/oracle/app/base
nagios_exit_codes=('UNKNOWN', 3, 'OK', 0, 'WARNING', 1, 'CRITICAL', 2)
status='OK'
ok=1
action=$1

case $action in
        "votedisk")
                #command=`/oracle/app/grid/19300/bin/crsctl query css votedisk | grep asm`
                #command=$(/oracle/app/grid/19300/bin/crsctl query css votedisk)
                command=`/oracle/app/grid/19300/bin/crsctl query css votedisk`

                case $comando in
                        *"failed"*|*"OFFLINE"*|*"PROC"*)
                                status='CRITICAL'
                                output_msg="Voting disk status check failed!"
                        ;;

                        * )
                                output_msg="Voting disks status check succeeded"
                        ;;
                esac

                output="[$status] $output_msg - $command"

        ;;

        "clusterstatus")
                comando=`/oracle/app/grid/19300/bin/crsctl query crs releaseversion`
                output_msg="All clusterware services are up (clusterware version: $comando)"
                output="$output_msg"

        ;;
esac


echo -e $output
exit 0

이 스크립트를 로컬에서 실행하면 결과는 다음과 같습니다.

[root@bbddmachine plugins]# sh ./script_prueba.sh votedisk
[OK] Voting disks status check succeeded - ## STATE File Universal Id File Name Disk group -- ----- ----------------- --------- --------- 1. ONLINE 8dfc2a9528244f95bf87bb394e793995 (/dev/mapper/asm_ocr1) [OCR] Located 1 voting disk(s).

그러나 Nagios 머신에서는 결과가 잘못되었습니다.

[nagios@ng1esp libexec]$ ./check_nrpe -2 -H 172.47.62.12 -t 60 -c check_crs_votedisk
[OK] Voting disks status check succeeded - Unable to communicate with the Cluster Synchronization Services daemon.

그러나 "clusterstatus"라는 스크립트에서 다른 옵션을 활성화하면 모든 것이 잘 작동합니다.

[nagios@ng1esp libexec]$ ./check_nrpe -2 -H 172.47.62.12 -t 60 -c check_crs_clusterstatus
All clusterware services are up (clusterware version: Oracle High Availability Services release version on the local node is [19.0.0.0.0])

관련 정보