bash 脚本:自上次运行后等待几秒钟

Posted

技术标签:

【中文标题】bash 脚本:自上次运行后等待几秒钟【英文标题】:bash script: wait a few seconds since last run 【发布时间】:2018-06-21 08:52:39 【问题描述】:

如何编写自上次运行后延迟其命令执行几秒钟的 bash 脚本? 我的意思是存储上次执行时间的某个地方,计算与当前时间的差异,然后休眠,比如 5 秒,如果上次运行时间少于 5 秒。

【问题讨论】:

touch somefilesomefile时间戳更新为当前时间。 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 脚本:自上次运行后等待几秒钟的主要内容,如果未能解决你的问题,请参考以下文章

让lua脚本等待/暂停/睡眠/阻塞几秒钟的最简单方法?

让lua脚本等待/暂停/睡眠/阻塞几秒钟的最简单方法?

Pygame 运行几秒钟后变得无响应

多次调用一个函数而不等待它完成

xamps 上的 MySQL 服务运行,然后在几秒钟后停止

运行几秒钟后,我的 AJAX 请求开始崩溃