Bash脚本如何在循环“while”中以10分钟的时间限制运行条件“if”

时间:2016-03-30 11:01:36

标签: bash shell

在这里,我想使用命令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

如何为停止的脚本提供时间限制?

3 个答案:

答案 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