1

我要解决的问题如下。我有一个长时间(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 上运行它。也请推荐其他轻量级的选择。

4

1 回答 1

1

没有什么可担心资源的,当一个脚本执行sleep时,它真的在睡觉。您应该担心两次执行之间是否发生任何事情,例如重新启动、停机等。这个结构:

while true; do
    sh script.sh
    sleep 86400
done

不会恢复,并且您不会在任何地方为下一次执行节省时间。类似于这个结构是有一个包装器,假设 f() 是你的工作

f() {
    echo working
}

wrapper() {
    f
    echo sleeping
    sleep 86400
    wrapper
}

wrapper

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

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

wrapper() {
    f
    at now +1 day wrapper
}

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

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

于 2020-09-17T18:54:13.163 回答