睡眠的资源利用
Posted
技术标签:
【中文标题】睡眠的资源利用【英文标题】:Resource utilisation of sleep 【发布时间】:2021-01-03 15:37:37 【问题描述】:我想解决的问题如下。我有一个长时间(1 到 2 小时)的运行任务,必须每天运行。所以 goto 选项是 cron。但问题是我必须在连续运行之间留出 24 小时的间隔。因此,现在使用 cron 将涉及在每次运行后重写 cron 作业文件。在这个例子之后,这可能会很清楚。
长期运行的作业“LR”从星期一下午 6 点开始,到当天晚上 7:30 结束。 周二应该从晚上 7:30 开始,而不是下午 6 点(就像周一一样)。这是因为连续运行之间必须有 24 小时的间隔。
这里显而易见的选择是让进程运行无限循环。开始 LR 工作。然后睡眠 24 小时并继续循环。这也很有效。在我的设置中有一个 bash 脚本正在运行这个循环。
while [ 1 == 1 ]; do
/bin/jobs/long_run.py
/bin/jobs/cleanup.sh
sleep 86400
done
所以我的问题是 CPU 资源消耗总量和 RAM 使用量是多少。 不确定这是否会影响答案;我在安卓手机上的 termux 上运行它。 也请推荐其他轻量级的选择。
【问题讨论】:
如果这是您的整个脚本,资源利用率将非常低。您可以使用at now + 1 day
将作业交给系统。
你可以使用'at'命令
【参考方案1】:
不用担心资源问题,当一个脚本执行sleep
时,它真的是在休眠。您应该担心两次执行之间是否发生任何事情,例如重新启动、停机等。这个结构:
while true; do
sh script.sh
sleep 86400
done
不会恢复,也不会在任何地方为下一次执行节省时间。类似于这个结构是有一个包装器,假设 f() 是你的工作
f()
echo working
wrapper()
f
echo sleeping
sleep 86400
wrapper
wrapper
所以现在你调用包装器,它工作、休眠并调用自己。你可以只使用这个,如果你对可能出现的问题没意见,至少在某处打印日期时间。
您可以使用cron
或at
将内部睡眠和包装器调用替换为作业调度。可能at
不是所有发行版的标准数据包(至少不是我的),而cron
是。你可以安装它。对于at
,包装器是这样的:
wrapper()
f
at now +1 day wrapper
使用cron
,你可以编辑crontab,比如this,但最好使用this这样的crontab文件,你要做的就是解析date
命令,创建日期前缀,更新crontab。
注意:可能还有其他用户的 cron 作业,现有的或之后添加的,这在最后一个链接中考虑。
【讨论】:
以上是关于睡眠的资源利用的主要内容,如果未能解决你的问题,请参考以下文章