Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本“如何运行条件”;如果;“在循环中”;而";有10分钟的时间限制_Bash_Shell - Fatal编程技术网

Bash脚本“如何运行条件”;如果;“在循环中”;而";有10分钟的时间限制

Bash脚本“如何运行条件”;如果;“在循环中”;而";有10分钟的时间限制,bash,shell,Bash,Shell,在这里,我想制作一个Bash脚本,通过使用命令netstat,我想知道应用程序是否已经在侦听端口 如果端口已经被监听了,那么他会给出结果 否则,脚本将在10分钟的时间限制内重复netstat命令,如果超过10分钟,则不会执行该命令,结果是错误 如果在终端中运行手动netstat命令: netstat -atn | grep 8779 结果是: comp@yd:~$ erp-enterprise/bin$ netstat -atn | grep 8779 tcp6 0 0

在这里,我想制作一个Bash脚本,通过使用命令
netstat
,我想知道应用程序是否已经在侦听端口

如果端口已经被监听了,那么他会给出结果

否则,脚本将在10分钟的时间限制内重复
netstat
命令,如果超过10分钟,则不会执行该命令,结果是错误

如果在终端中运行手动
netstat
命令:

netstat -atn | grep 8779
结果是:

comp@yd:~$ erp-enterprise/bin$ netstat -atn | grep 8779
tcp6       0      0 :::8779                 :::*                    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 !
下面是我制作的脚本,下一步是什么

#!/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:~$ erp-enterprise/bin$ netstat -atn | grep 8779
tcp6       0      0 :::8779                 :::*                    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 !
如果应用程序已经在侦听端口,脚本将停止并弹出结果

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

如何为停止的脚本指定时间限制?

您可以使用
timeout
命令:

timeout 10m /path/to/your_script.sh
上述命令将启动
/path/to/your_script.sh
,如果未自行终止,则在10分钟后终止


进一步阅读:

您可以使用
timeout
命令:

timeout 10m /path/to/your_script.sh
上述命令将启动
/path/to/your_script.sh
,如果未自行终止,则在10分钟后终止


进一步阅读:

我喜欢@hek2mgl的解决方案,但如果您确实希望在脚本中执行此操作,则可以使用变量来查看经过了多少时间。因此,您的循环可以将条件更改为

while [[ "$NETSTAT" = "" ]] && [[ $SECONDS -lt 600 ]];


要使用内置测试来判断字符串是否为空,我喜欢@hek2mgl的解决方案,但是如果您确实想在脚本中进行测试,可以使用变量来查看经过了多少时间。因此,您的循环可以将条件更改为

while [[ "$NETSTAT" = "" ]] && [[ $SECONDS -lt 600 ]];


要使用内置测试来判断字符串是否为空,可以在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

您可以在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

不确定什么应该有时间限制,但您可以在循环中重试,直到经过一定的时间,或者您可以使用运行命令。哦,是的,先生。。但我试着在上面解释,展示我的bash脚本,以及如何继续我的脚本?如何添加脚本?所以我的意思是,sir,你是想在脚本中设置一个超时,还是想在执行时设置一个超时?(请不要叫我“先生”)好的,我想在脚本的循环部分@BiffenDo中给出一个超时,你想让循环本身停止,还是想让对
netstat
的调用超时?不确定什么应该有时间限制,但你可以在循环中重试,直到经过一定的时间,或者你可以用它来执行命令是的,长官。。但我试着在上面解释,展示我的bash脚本,以及如何继续我的脚本?如何添加脚本?所以我的意思是,sir,你是想在脚本中设置一个超时,还是想在执行时设置一个超时?(请不要叫我“先生”)好的,我想在脚本的循环部分@BiffenDo中给出一个超时,你想让循环本身停止,还是想让对
netstat
的调用超时?