在这里,我想使用命令netstat
创建一个Bash脚本,我想知道应用程序是否已经在侦听端口。
如果已收听该端口,则会显示结果。
如果没有,脚本将以10分钟的时间限制重复netstat
命令,如果超过10分钟,则不会执行命令,结果是错误。
如果在终端中运行手动netstat
命令:
netstat -atn | grep 8779
结果:
comp@yd:~$ erp-enterprise/bin$ netstat -atn | grep 8779
tcp6 0 0 :::8779 :::* LISTEN
我制作了以下脚本,下一步是什么?
#!/bin/bash
NETSTAT=`netstat -ant | grep :::8779`
echo $NETSTAT
VAR_ERR="Port APP 8779, not listen !"
VAR_SUCS="Port APP 8779, LISTEN"
while [[ "$NETSTAT" = "" ]] ;
do
echo $NETSTAT
if [[ -z "$NETSTAT" ]];
then
echo $VAR_ERR
NETSTAT=`netstat -ant | grep :::8082`
else
echo $VAR_SUCS
exit 0
done
echo $VAR_SUCS
如果应用程序没有监听端口,脚本将继续循环。
结果:
comp@yd:~$ ./listen_port.sh
Port APP 8082, not listen !
Port APP 8082, not listen !
Port APP 8082, not listen !
Port APP 8082, not listen !
Port APP 8082, not listen !
如果应用程序已在侦听端口,则脚本将停止并弹出结果。
comp@yd:~$ ./listen_port.sh
Port APP 8082, not listen !
Port APP 8082, not listen !
Port APP 8082, not listen !
Port APP 8082, not listen !
Port APP 8082, not listen !
Port APP 8779, LISTEN
如何为停止的脚本提供时间限制?
答案 0 :(得分:4)
您可以使用timeout
命令:
timeout 10m /path/to/your_script.sh
上述命令将启动/path/to/your_script.sh
并在10分钟后终止,如果它还没有终止它。
进一步阅读:man timeout
答案 1 :(得分:2)
我喜欢@ hek2mgl的解决方案,但是如果您确实想在脚本中执行此操作,则可以使用SECONDS
变量来查看已经过了多长时间。所以你的循环可以将条件改为
while [[ "$NETSTAT" = "" ]] && [[ $SECONDS -lt 600 ]];
或
while [[ -z "$NETSTAT" ]] && [[ $SECONDS -lt 600 ]];
使用内置测试判断字符串是否为空
答案 2 :(得分:0)
您可以在bash脚本中执行此操作,而不依赖于其他工具:
#! /bin/bash
trap 'echo "error after retrying for $secs"; exit 1' USR1
secs=600
{ sleep $secs; kill -s USR1 0; } &
while :
do
netstat -ant | grep -q :::8082 && exit 0
sleep 1
done