bash shell脚本睡眠或cronjob哪个更受欢迎?

时间:2013-09-23 20:00:49

标签: bash cron sleep

我想每5分钟完成一项任务。我想控制何时可以开始以及何时可以结束。

一种方法是在while循环中使用sleep,另一种方法是使用cronjob。哪一个是性能优先的?

谢谢!

2 个答案:

答案 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