RedHat OS에서 스크립트를 실행하려고 할 때 문제가 발생합니다. 산술 구문 오류가 발생합니다.
이제 실행하려는 스크립트는 다음과 같습니다.
#!/bin/ksh
echo ""
echo " = K+WA =";
WA_PORT="`cat /usr/kplushome/entities/Standalone/config/kondor.active |grep PORTAL_PORT|cut -d '&' -f 2`"
#== Checking Tomcat of WebAccess
printf "%25s" Tomcat
touch /usr/kplushome/entities/Standalone/config/webaccess/WebaccessDomainTomcat/bin/tomcat-*.pid
PID=`cat /usr/kplushome/entities/Standalone/config/webaccess/WebaccessDomainTomcat/bin/tomcat-*.pid`
if [[ $PID = "" ]];then
echo " x 0"
else
PSPID=`/bin/ps -eo pid | grep -w $PID`
if [[ $PSPID -eq $PID ]];then
/bin/ps -ef | grep $PID | grep -v grep | awk 'NR==1 {print " = "$8 $9 $10 $11 $12 $13 $14 $15}'
else
echo " x 0"
fi
fi
PORT_STATUS=`netstat -an | grep ${WA_PORT} | grep LISTEN | perl -pe "s/^.+\n/LISTENING/g;"`
PORT_STATUS=${PORT_STATUS:="NOT LISTENING!!!"}
echo " Port ${WA_PORT}/TCP = ${PORT_STATUS}"
cd /usr/kplushome/entities/Standalone/config/webaccess/WebaccessServer/etc
(PATH=/usr/ucb:$PATH; ./checkall.sh;) | perl -pe "s,^, ,g;"
echo ""
문제는 산술 구문 오류로 인해 위반된 유닉스의 규칙을 볼 수 없기 때문에 15번째 줄에 아무런 문제가 없다는 것입니다. 아니면 뭔가 빠진 것입니까? 전문가님들의 조언을 부탁드려도 될까요? 어떤 도움이라도 주시면 감사하겠습니다. 감사합니다.
답변1
스크립트의 14행과 15행은 다음과 같습니다.
PSPID=`/bin/ps -eo pid | grep -w $PID`
if [[ $PSPID -eq $PID ]];then
15행에서 오류가 발생하는 경우 가장 가능성이 높은 원인은 PSPID
또는 PID
정의되지 않은 것이므로 다음과 같은 효과적인 15행이 나타날 수 있습니다.
if [[ -eq 12345 ]];then
이는 구문상의 오류입니다. 변수를 인용하여(예: "$PID"
대신 $PID
) 이를 완화할 수 있습니다.
여담이지만, 스크립트가 실행될 때 무슨 일이 일어나고 있는지 확인하는 것이 도움이 됩니다. 출력이 약간 흐려지지만 스크립트의 문제가 있는 부분에 대해 오작동하는 부분을 접두사로 붙이면 set -x
이제 표준 출력에 스크립트를 실행하는 셸로 전송되는 내용이 명령별로 포함됩니다.
답변2
오류 메시지에는 두 개의 숫자가 표시됩니다. 프로세스 ID인 것 같습니다. 가능한 대답은 귀하의 회선이
PID=`cat /usr/kplushome/entities/Standalone/config/webaccess/WebaccessDomainTomcat/bin/tomcat-*.pid`
2개의 파일을 찾고 있으며 변수에 새 줄로 구분된 2개의 pid가 설정되어 있습니다. 에서 사용하면 if [[ $PSPID -eq $PID ]]
뒤에 2개의 숫자가 표시되는데 -eq
, 이는 구문 오류입니다.
이러한 유형의 구문 오류를 방지하려면 변수(예: "$PID"
)를 큰따옴표로 묶어야 하지만 실제 문제는 1이 아닌 2개의 숫자가 있다는 것입니다. 상황에 적합한 것이 무엇인지에 따라 각 pid를 별도로 처리하는 루프를 간단히 추가할 수 있습니다. ( for pid in $PID
...).