我想每5分钟完成一项任务。我想控制何时可以开始以及何时可以结束。
一种方法是在while循环中使用sleep
,另一种方法是使用cronjob。哪一个是性能优先的?
谢谢!
答案 0 :(得分:3)
使用cron作业。 Cron是为这种用例而制作的。它让你不必自己编写while循环代码。
但是,如果脚本的运行时间不可预测且超出了计时器计划,则cron可能不适用。
性能方面除非您分享脚本的功能以及脚本执行的频率,否则很难分辨。但总的来说,这两种选择都不应对绩效产生负面影响。
答案 1 :(得分: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