Bash中的计时器事件

时间:2017-05-11 18:09:46

标签: bash shell timer

我有一个无限期运行的bash脚本。我已经高低搜索了一个解决方案,将一个定时事件添加到每5分钟触发一次的脚本中,同时脚本的其余部分继续运行。我不能让脚本睡眠,因为它不断向服务器发送/接收信息。有没有人有任何功能或想法来实现这一目标。基本上我希望它每300秒(5分钟)向服务器发送一个特定的命令。我没有权限重写服务器代码每5分钟请求一次命令。

基本上主脚本与此类似:

#!/bin/bash

Var1="localhost"
Var2="2356"
Var3="DSDSASAQ"
Var4= "Admin"
#other variables as needed.

function fun1(){
#do some stuff
}
function fun2(){
#do some stuff
}
function fun3(){
#do some stuff
}

#Main code section.
exec 3<>/dev/tcp/${Var1}/${Var2}
echo "login Var4 Var3" >&3

While read LINE <&3;
do
#do some stuff 
done
exit $?

感谢任何帮助。此外,我尝试了诸如start = $ SECONDS和duration = $ SECONDS- $ start之类的东西,并在while循环中使用if ... then语句进行检查,但它会在重置start变量之前多次触发命令。 ..服务器在检测到垃圾邮件时也喜欢断开链接,因此在短时间内发送10次以上的相同命令并不理想。

2 个答案:

答案 0 :(得分:3)

在单独的后台进程中运行循环。

#!/bin/bash

...

#Main code section.
exec 3<>/dev/tcp/${Var1}/${Var2}

# watchdog
while sleep 300 & wait; do
  echo "login Var4 Var3"
done >&3 &
trap "kill $!" EXIT

while read LINE <&3;
do
#do some stuff 
done
exit $?

答案 1 :(得分:1)

我认为你错了,如果...那么条件。 这是我的镜头......它应该在所需的时间只发送一次“特殊命令”。

#!/bin/bash

# Set the "next time" when special command should be sent
((start=SECONDS+300))

while read LINE <&3; do
    echo "do some stuff"

    # Did we reach the "next time" ... if yes
    if ((SECONDS>=start)); then
        echo "special command"
        # And now set the new "next time"
        ((start=SECONDS+300))
    fi
done