如何使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,它确实会在一段时间后终止进程,但我的问题是内部循环不知道已经过了多少时间。我可以在脚本中添加什么来实现这一点吗?

谢谢!

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)

有两件事:

  • 上面的想法只是将到期时间和当前时间转换为数字,使比较更容易
  • 似乎你想循环并执行_Something,然后当时间到期时,在结束时执行一些操作,然后退出循环。我已将"do_Something_at_end"置于定时循环之外
  • 如果"do_Something"是一个长时间运行的过程,并且可能需要比所需更长的时间,请考虑将其作为后台作业运行,然后进行"sleep${MAX_TIME_ALLOWED}",然后"终止"它
  • 您可以在"do_something"中放入一些内容来检查运行时间限制,以确保每次运行都不会超支,但这需要详细了解该脚本的作用
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

相关内容

  • 没有找到相关文章

最新更新