ksh의 AIX에서 서비스를 시작하거나 중지하려고 합니다.
서비스가 종료되었는지 등을 확인하기 위해 바보 방지 메커니즘 구축을 시작하려고 합니다.
이건 내 스크립트야
#!/bin/ksh
#################################################################################
# PARAMETERS & VARIABLES SECTION #
#################################################################################
DBI_LOC="DBI/InstallCollector/dbi_collector/bin"
#Put input option to upper case.
OPTION=$( echo "$1" | tr "[:lower:]" "[:upper:]" )
#################################################################################
# FUNCTION SECTION #
#################################################################################
parseresults() {
typeset RESULT="$1"
if [ "${OPTION}" = "START" ] ; then
case "${RESULT}" in
*)
echo "Success"
;;
esac
else
case "${RESULT}" in
DBI.(Collector is not running))
echo "Collector is already down. Continuing..."
;;
DBI.(performance data collector shutdown COMPLETE))
echo "Success shutting down collector. Continuing..."
;;
*)
echo "Error shutting down the collector. Exiting with error."
exit 1
;;
esac
fi
}
#################################################################################
# MAIN SCRIPT SECTION #
#################################################################################
case "${OPTION}" in
"START")
echo "Starting the collectors..."
RESULT=$(ksh ~/${DBI_LOC}/start_dbi_collector.sh)
;;
"STOP")
echo "Stopping the collectors..."
RESULT=$(ksh ~/${DBI_LOC}/stop_dbi_collector.sh)
;;
*)
echo "Error: No Parameter specified. Must be either start or stop"
exit 1
;;
esac
echo ${RESULT}
parseresults ${RESULT}
echo
echo
두 개의 DBI 문구를 일치시킬 수 없는 것 같습니다. 둘 다 중지 스크립트에서 가능한 출력입니다. 나는 이러한 성공을 고려하고 싶지만 다른 어떤 것도 실패할 수 있습니다.
나는 아직도 정규 표현식(그리고 Java와 ksh 등에서 정규 표현식이 어떻게 다른지)을 배우는 중이므로 제가 서투른 점을 용서해 주셔야 합니다. 내가 뭘 잘못했나요? 귀하의 답변에서 내 접근 방식이 작동하지 않는 이유를 설명할 수 있습니까? 정답은 작동합니다. (다른 사람에게 낚시하는 법을 가르쳐주면 나도 좋아…)
편집하다:제 생각에는 괄호와 관련이 있는 것 같습니다. 동일한 정지 문제가 있는 다른 스크립트가 있는데 대괄호를 제거하면 함수가 완전히 정지됩니다. 그래서 내 팁은 여전히 구문 일치를 수행하는 방법입니다.
답변1
"START" 및 "STOP"과 마찬가지로 일치시키려는 문자열 주위에 따옴표를 추가해야 합니다.
만약에스크립트는 "DBI. (Collector not running)"을 출력합니다. 그러면 첫 번째 Case 문으로 다음이 있어야 합니다.
case "${RESULT}" in
"DBI.(Collector is not running)")
답변2
글쎄, 나는 사례 설명에서 egrep으로 전환했습니다. 그것이 도움이 되는 것 같았기 때문입니다. 함수에 인수를 전달하는 데 문제가 있어서 포기했습니다. 최고는 아니지만 효과가 있었습니다. 이에 대해 더 생각이 있으신가요?
#!/bin/ksh
#################################################################################
# PARAMETERS & VARIABLES SECTION #
#################################################################################
DBI_LOC="DBI/InstallCollector/dbi_collector/bin"
#Put input option to upper case.
OPTION=$( echo "$1" | tr "[:lower:]" "[:upper:]" )
#################################################################################
# FUNCTION SECTION #
#################################################################################
parseresults() {
if [ "${OPTION}" = "START" ] ; then
echo "Success"
return 0
else
echo ${RESULT} | egrep -s ".*DBI.*not\srunning.*"
if [ $? = 0 ] ; then
echo "Collector is already down. Continuing..."
return 0
fi
echo ${RESULT} | egrep -s ".*DBI.*COMPLETE.*"
if [ $? = 0 ] ; then
echo "Success shutting down collector. Continuing..."
return 0
fi
echo "Error shutting down the collector. Exiting with error."
return 1
fi
}
#################################################################################
# MAIN SCRIPT SECTION #
#################################################################################
case "${OPTION}" in
"START")
echo "Starting the collectors..."
RESULT=$(ksh ~/${DBI_LOC}/start_dbi_collector.sh)
;;
"STOP")
echo "Stopping the collectors..."
RESULT=$(ksh ~/${DBI_LOC}/stop_dbi_collector.sh)
;;
*)
echo "Error: No Parameter specified. Must be either start or stop"
exit 1
;;
esac
echo ${RESULT}
parseresults
if [ ! $? = 0 ] ; then
exit 1
fi
echo
echo