2016-07-29 69 views
0

我不知道这是否已经被问过,但如果我有一个运行一个无限循环的脚本:如何使bash脚本在有限的时间内运行,但不能立即终止进程?

#!/bin/bash 
while : 
do 
     echo "Press [CTRL+C] to stop.." 
     sleep 1 
done 

,我要运行它只有10秒,但我不希望它马上停止,例如,在psudo代码,我想是这样的:

while true: 
    if 10 seconds elapsed: 
     do something 
     then kill 

    else 
     keep going #this takes an arbitrary amount of time 

我试过gtimeout,和它的一定时间后杀死进程,但我的问题是,内循环不知道已经过了多少时间。有什么我可以添加到脚本本身来实现这一目标吗?

谢谢!

+0

所以你想要一个看门狗的功能,如果它发出10秒没有信号表示没有问题,就会终止脚本? –

+0

不,我只是想要循环,它会执行一些命令,重复运行一段时间,然后在时间耗尽之前执行其他操作。所以我想让内部循环知道时间。希望这是有道理的。 – Lana

+0

我不知道你的意思,但你可以使用'$ SECONDS'变量吗?它从shell启动时开始计数,可以在任何时候重置为0。 –

回答

1
NUM_SECS_TO_RUN=605 # Time you want to run for in seconds, 1 day would be 84600 

TIME_NOW=$(date +"%H:%M:%S") 

END_TIME=$(date -d "${TIME_NOW} today + ${NUM_SECS_TO_RUN} seconds" +"%y%m%d%H%M%S") 

echo "Starting" $(date) 

while [ $(date +"%y%m%d%H%M%S") -lt ${END_TIME} ] 
do 
    # whatever it is that you want to do repeatedly until the period expires 
    do_something 
done 

echo "Expired" $(date) 
do_something_at_end # whatever it is you want to do right at the end 
echo "FInished" $(date) 

一对夫妇的东西:

  • 上面的想法是简单地将到期时间和当前时间转换为数字,以便于比较
  • 看起来你想循环和do_Something,然后当时间到期时在最后做一些事情然后退出循环。我在定时循环之外放置了“do_Something_at_end”。
  • 如果“do_Something”是一个长期运行的进程,并可能需要更长的时间比需要的,考虑运行它作为后台作业,然后有一个“睡眠$ {} MAX_TIME_ALLOWED”之后,“杀”了。
  • 您可以在“do_something”中加入一些内容来检查运行时间限制,以确保每次运行不会超出,但这需要详细了解该脚本的功能。
0
for t in 0 1 2 3 4 5 6 7 8 9 ; do 
    if [ $t -eq 9 ] ; then 
     #do something 
     kill 
     break 
    fi 
    echo "Press [CTRL+C] to stop.." 
    sleep 1 
done 
# keep going 

24小时运行,检查每一秒(注意我把提示圈外的,所以它没有回音86400次):

t=0 
echo "Press [CTRL+C] to stop.." 
while true ; do 
    if [ $t -eq 86400 ] ; then 
     #do something 
     kill 
     break 
    fi 
    sleep 1 
    t=$((t + 1)) 
done 
# keep going 
+0

好吧,这看起来不错,但如果我想跑24小时呢? – Lana

+0

好吧,我不确定这是否有效,因为这样:#keep去,可能需要多于1秒。这不是瞬间的。 - 拉娜18分钟前 – Lana

+0

我真的不知道我明白这个问题。 –