bash 脚本:自上次运行后等待几秒钟
Posted
技术标签:
【中文标题】bash 脚本:自上次运行后等待几秒钟【英文标题】:bash script: wait a few seconds since last run 【发布时间】:2018-06-21 08:52:39 【问题描述】:如何编写自上次运行后延迟其命令执行几秒钟的 bash 脚本? 我的意思是存储上次执行时间的某个地方,计算与当前时间的差异,然后休眠,比如 5 秒,如果上次运行时间少于 5 秒。
【问题讨论】:
touch somefile
将somefile
的时间戳更新为当前时间。 stat --format=%Y somefile
以整数形式为您提供文件的时间戳(如果您有 GNU stat)。这两个命令应该是你所需要的,不是吗? (如果您需要防止多个并发调用,那么事情会变得更加棘手,并且您开始希望另外使用 flock
进行锁定)。
你为什么还要这样做?它闻起来像XY problem。可能还有其他解决方案,例如: (a) 在脚本结束时休眠; (b) 让父进程休眠; (c) 根本不睡觉; (d) 使用 cron; (e) 使用手表。
jenkins 中的 docker-compose 有问题。在使用 docker-compose 构建时,它是一个记录在案的错误,同时会导致重复的容器错误。所以我使用此修复程序在管道中使用 docker-compose
【参考方案1】:
我要问自己的第一个问题是,“我真的需要延迟执行这些命令的脚本吗?”如果您可以并行运行多个命令,然后使用 wait 命令等待每个进程完成,那通常更快、更可取。看看这个 SO question 讨论 the difference between wait and sleep
也就是说,如果你真的需要等待至少五秒钟,你可以这样做:
#!/bin/bash
export delay_seconds=5
export start_time=`date +%s`
#Run some commands here...
seconds_since_start=`expr \`date +%s\` - $start_time`
if [ $seconds_since_start -lt $delay_seconds ]; then
time_remaining=`expr $delay_seconds - $seconds_since_start`
echo "Sleeping "$time_remaining" seconds..."
sleep $time_remaining
else
echo $seconds_since_start" seconds have already passed since the commands above started. Continuing..."
fi
echo "Script finished."
【讨论】:
【参考方案2】:如果有人需要它:
timeout=5
timefile=/tmp/dc-time.info
if [[ ! -e $timefile ]]; then
touch $timefile
fi
old=`stat $timefile --format=%Y`
touch $timefile
new=`stat $timefile --format=%Y`
count=$((timeout-new+old))
if [ $count -gt 0 ]
then
echo "waiting..."
sleep $count
fi
【讨论】:
以上是关于bash 脚本:自上次运行后等待几秒钟的主要内容,如果未能解决你的问题,请参考以下文章