스크립트를 사용하여 사용자 정의 서비스 상태 확인

스크립트를 사용하여 사용자 정의 서비스 상태 확인

WebLogic 호스팅 서버를 시작하는 몇 가지 쉘 스크립트가 있습니다. 다음을 수행하는 기본 스크립트를 디자인해야 합니다.

  • 실행 구성 요소\호스팅 서버 셸 스크립트
  • 구성 요소의 포트가 2분 동안 수신 대기하는지 확인하세요(이 값은 무엇이든 가능하지만 이러한 서비스는 시작하는 데 2분 이상 걸리지 않아야 함).
  • 2분 이내에 서비스가 시작되면 계속해서 다음 서비스를 시작하고, 그렇지 않으면 서비스 시작에 실패했다는 로그 메시지를 작성하여 계속합니다.

스크립트는 다음과 같습니다.

svcs = some_array_of_svcs

log  = '/path_to_log/log.txt'

' start each service'
for each $svc in $svcs
   echo "starting $svc" >> ${log}
   . /path_to_scripts/$svc
' check to see if the service started
loop for max 2 mins
   if port is listening
      echo 'Service started successfully' >> ${log}
      start the next service
   else
      echo 'Service did not start within the specified timeout' >> ${log}
      start the next service
   end if
next

포트 상태를 확인하려면 코드가 필요합니다N서비스당 시간(분)

답변1

netcat이 구출됩니다... Netcat은 텔넷과 매우 유사하지만 몇 가지 놀라운 추가 옵션이 있습니다. 이 경우 특별한 용도 중 하나는 연결이 유효한지 확인하는 -z입니다. 시간 초과 변수와 함께 시스템이 서비스가 수신 중인지 반복적으로 확인하도록 할 수 있습니다.

로컬에서는 SSH를 활성화했지만 텔넷은 활성화하지 않았습니다.

$ nc -zw10 localhost 22
$ echo $?
0
$ nc -zw10 localhost 23
$ echo $?
1

테스트를 더 명확하게 하기 위해... 앞서 언급한 제한 시간 2분을 가정합니다. 4번 확인하고 매번 30분 동안 타임아웃됩니다. 날짜 스탬프가 더 좋을 수도 있지만 이는 시작일 뿐입니다.

for i in {1..4}; do
  nc -zw30 localhost 22
  x=$?
  [[ $x -eq 0 ]] && break
done
if [[ $x -eq 0 ]]; then
  echo 'Service started successfully' >> ${log}
else
  echo 'Service did not start within the specified timeout' >> ${log}
fi
start next service

답변2

포트 상태를 확인하는 또 다른 방법은 netstat유틸리티를 사용하는 것입니다.

user@debian:~$ netstat -4 -l --tcp -p # Show programs listening to IPv4/TCP ports
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address    State       
tcp        0      0 *:53             *:*            LISTEN   2389/named      
tcp        0      0 *:22             *:*            LISTEN   2936/sshd       
tcp        0      0 *:5432           *:*            LISTEN   2475/postgres   
tcp        0      0 *:25             *:*            LISTEN   2961/exim4 

여기서는 DNS, SSH, PosgtreSQL 및 Mail 데몬이 해당 포트에서 수신 대기 중이기 때문에 시작되는 것을 볼 수 있습니다. 또한 마지막 열은 각 특정 포트에서 어떤 애플리케이션이 수신 대기 중인지 알려줍니다.

단일 서비스를 확인하는 스크립트는 다음과 같습니다.

PORT=... the port we need to check ...
# Current time in seconds + 15 minutes
TRYUNTIL=$(( $(date +%s) - (60*15) ))
# 0 is down, 1 is up
STATUS=0

# While the service is still down and the current time is before our limit
while [[ (( $STATUS = 0 )) && (( $(date +%s) < $TRYUNTIL ))  ]]
do
   STATUS=$(netstat -4 -l --tcp | grep "*:$PORT" | wc -l)
   # Lets not overload the system with constant checking,
   # if the service is still down
   if [[ $STATUS = 0 ]]; then
        sleep 5s
   fi
done

관련 정보