我想每5分钟做一个任务。我想控制什么时候可以开始,什么时候可以结束。
一种方法是sleep
在 while true 循环中使用,另一种方法是使用 cronjob。哪一个在性能方面是首选?
谢谢!
使用 cron 作业。Cron 是为这种类型的用例而设计的。它使您不必自己编写 while 循环。
但是,如果脚本的运行时间不可预测并且超出了计时器计划,则 cron 可能不适合。
性能方面 除非您分享脚本的功能和执行频率,否则很难说清楚。但一般来说,这两种选择都不应该对性能产生负面影响。
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