睡眠的资源利用

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

所以现在你调用包装器,它工作、休眠并调用自己。你可以只使用这个,如果你对可能出现的问题没意见,至少在某处打印日期时间。

您可以使用cronat 将内部睡眠和包装器调用替换为作业调度。可能at 不是所有发行版的标准数据包(至少不是我的),而cron 是。你可以安装它。对于at,包装器是这样的:

wrapper() 
    f
    at now +1 day wrapper

使用cron,你可以编辑crontab,比如this,但最好使用this这样的crontab文件,你要做的就是解析date命令,创建日期前缀,更新crontab。

注意:可能还有其他用户的 cron 作业,现有的或之后添加的,这在最后一个链接中考虑。

【讨论】:

以上是关于睡眠的资源利用的主要内容,如果未能解决你的问题,请参考以下文章

Linux内核中的延时函数详解

多线程之——死锁

利用消息将一个进程的数据发送到另一个进程(Linux)

win 10 睡眠无法唤醒

睡眠模式是啥?

python怎么利用同义词词林