使用脚本检查自定义服务的状态

使用脚本检查自定义服务的状态

我有一些启动 WebLogic 托管服务器的 shell 脚本。我需要设计一个执行以下操作的主脚本:

  • 执行组件\托管服务器的 shell 脚本
  • 检查该组件的端口是否侦听 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 与 telnet 非常相似,但有一些额外的疯狂选项。在这种情况下,特殊用途之一是 -z,它只是检查连接是否有效。与超时变量一起,您可以让系统重复检查服务是否正在侦听。

我在本地启用了 ssh,但没有启用 telnet。

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

为了让测试更加清晰...这是假设您之前提到的 2 分钟超时。检查4次,每次超时半分钟。日期戳可能会更好,但这只是一个开始。

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

相关内容