2016-06-02 4 views
1

실행중인 프로세스가 있는지 확인하기 위해 프로세스 모니터를 만들었고, 발견되면 해당 프로세스가 허용되는지 아닌지를 확인해야합니다. 기본적으로 보안 검사. 실행중인 프로세스를 찾아보고 예상 한 결과를 얻을 때 유용합니다. 그러나, 프로세스가 발견되지 않을 때 어떤 이유로 나는 "ok"대신에 빈 라인을 뱉어 버릴 것입니다. 나는 변수 rmanRUNNING이 프로세스가 실행되고 있지 않다면 0으로 채워진다는 것을 안다. 그래서 나는 첫 번째 if 문이 왜 다른 곳으로 넘어가는지 확실하지 않다. 그래서 "ok"를 수행한다. "닫으십시오. 어떤 도움 이라든지 대단히 감사 할 것입니다. 아래를 참조하십시오 : 나는 간단한 뭔가가 있어야합니다 bash 프로세스 모니터 스크립트는 프로세스가 발견되지 않을 때 비어 있습니다.

#!/bin/bash 

rmanRUNNING=`ps -ef|grep rman|egrep -v grep|wc -l` 

if [ "$rmanRUNNING" -gt "0" ] 
then 
    PPIDs=($(ps -oppid= $(pgrep rman))) 
    kshddPID=($(pgrep -f 'ksh.*/rman_dd.ksh')) 
    for i in "${PPIDs[@]}" 
    do 
     : 
     for j in "${kshddPID[@]}" 
     do 
      : 
      if [ "$i" == "$j" ] 
       then 
        result="ok" 
      else 
       result="bad" 
       break 
      fi 
     done 
     if [ "$result" == "bad" ] 
      then 
       break 
     fi 
    done 
    echo "$result" 
else 
    echo "ok" 
fi 

, 나는 단지 내가이 일을 단순화 경우,이를 분리 할 수없는 것 바로 다음 현재 조건과 가진 경우 다른와 다음 에코 에코, 제대로 작동하는 것 같아요, 그래서 내가 볼 수없는 몇 가지 오류가 발생하는 경우 그것은 메인 내부의 루프와 관련이 있다고 느낍니다. 또는 break가 작동하는 방식에 대한 오해와 관련이 있습니다. 그래서 빈 "result"변수를 echo 한 다음 종료하는 지점으로 나가고 있습니다. 확실하지 않습니다.

미리 감사드립니다.

+0

나는이 문제에 관한 생각하지 않지만,'rmanRunning'에 할당 할 때 왜 'pgrep' 사용하지 않는? – Barmar

+0

'bash -x'를 사용하여 스크립트를 실행하면 실행시 줄이 표시됩니다. 이것은 어디서 잘못 될지 알려줄 것입니다. – Barmar

+0

'$ rmanRunning'이 0보다 큰 경우 빈 출력을 얻지 만'$ kshddPID'는 비어 있습니다. 내부 'for' 루프가 아무 것도하지 않기 때문입니다. – Barmar

답변

1

문제는 ps -ef | grep rman | grep -v grep이 프로세스 이름 rman_check.sh과 일치한다는 것입니다. 따라서 스크립트를 실행할 때 $rmanRunning0이 아니기 때문에 자체 계산에 포함됩니다.

-x 옵션과 함께 pgrep 옵션을 사용하면 하위 문자열을 찾는 대신 명령 이름과 정확히 일치하도록 지정할 수 있습니다.

#!/bin/bash 

rmanRunning=$(pgrep -x rman | wc -l) 

if [ "$rmanRUNNING" -gt "0" ] 
then 
    PPIDs=($(ps -oppid= $(pgrep -x rman))) 
    kshddPID=($(pgrep -f 'ksh.*/rman_dd.ksh')) 
    for i in "${PPIDs[@]}" 
    do 
     : 
     for j in "${kshddPID[@]}" 
     do 
      : 
      if [ "$i" == "$j" ] 
       then 
        result="ok" 
      else 
       result="bad" 
       break 
      fi 
     done 
     if [ "$result" == "bad" ] 
      then 
       break 
     fi 
    done 
    echo "$result" 
else 
    echo "ok" 
fi 

그러나 전반적인 논리에도 문제가 있습니다. 두 개의 rman_dd.ksh 프로세스가 있으며 각각이 rman 하위 프로세스가있는 경우 한 부모를 다른 프로세스와 비교할 때 bad으로보고합니다. 더 간단한 방법은 두 개의 PID 목록을 정렬하고 비교하는 것입니다.

PPIDs=$(pgrep -x rman | sort) 
kshddPIDs=$(pgrep -f 'ksh.*rman_dd.ksh' | sort) 
if [ "$PPIDs" = "$kshddPIDs" ] 
then echo "ok" 
else echo "bad" 
fi 
+0

물론 충분합니다. 하단의 제안에도 감사드립니다. 고맙습니다! – billhubb84

+0

BTW, 대신 스크립트의 시작 부분에'set -x'를 사용하도록 제안했다면, 디버깅시에 그것을 보았을 것입니다. 나는 그것을 기억할 것이다. – Barmar