我有一些启动 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