1

我想每5分钟做一个任务。我想控制什么时候可以开始,什么时候可以结束。

一种方法是sleep在 while true 循环中使用,另一种方法是使用 cronjob。哪一个在性能方面是首选?

谢谢!

4

2 回答 2

3

使用 cron 作业。Cron 是为这种类型的用例而设计的。它使您不必自己编写 while 循环。

但是,如果脚本的运行时间不可预测并且超出了计时器计划,则 cron 可能不适合。

性能方面 除非您分享脚本的功能和执行频率,否则很难说清楚。但一般来说,这两种选择都不应该对性能产生负面影响。

于 2013-09-23T20:07:13.710 回答
2

cron 几乎总是最好的解决方案。

如果您尝试使用在 while 循环中运行的简单脚本自己执行此操作:

while true; do
  task
  sleep 300
done

您最终会发现什么都没有发生,因为您的任务由于暂时性错误而失败。或者系统重新启动。或者一些这样的。使您的脚本足够健壮以处理所有这些可能性是一项艰巨的工作,而且没有必要。毕竟,这就是 cron 的用途。

此外,如果任务花费了一些不平凡的时间,上述简单的 while 循环将慢慢地与时钟不同步。这可以修复:

while true; do
  task
  sleep $((300 - $(date +%s) % 300))
done

同样,这几乎不值得,因为 cron 也会为你做这件事。但是,如果上一次调用以某种方式卡住,cron不会让您免于在上一次调用完成之前启动任务。所以它不是完全免费的,但它仍然为您提供了一些额外的稳健性。

解决卡住任务问题的一种简单方法是使用该flock实用程序。例如,您可以cron包含以下内容的脚本:

(
  flock -n 8 || { 
    logger -p user.warning Task is taking too long
    # You might want to kill the stuck task here. See pkill
    exit 1
  }
  # Do the task here
) 8> /tmp/my_task.lck
于 2013-09-23T21:10:24.660 回答