使用 cron 与系统管理服务执行频繁任务

使用 cron 与系统管理服务执行频繁任务

如果某些任务应该以频繁但不必精确的方式运行,那么使用与仅使用带有循环脚本cron的服务(例如由管理)相比有什么好处upstart

#!/bin/sh
while true
do
    do_task
    sleep 3600
done

通过今天的命令upstart,我们可以选择用户setuid,并且可以将 upstart 配置为在脚本终止时重新启动脚本,在需要时停止脚本等等。

在这种情况下,弄乱 cron 有什么实际好处吗?

答案1

从 Cron 运行“更简洁”。首先,它占用的资源更少 - 您的脚本将消耗额外的资源(shell、计时器和额外的进程和文件描述符的内存)。虽然实际上机器非常强大,但它不够优雅。

Cron 还可以巧妙地处理 stdout -> 电子邮件或其他内容,这对于调试很有用。

如果您使用 Cron,则不需要处理不同的权限,只需告诉 cron 使用哪个用户即可。

当然,使用 upstart 确实有一些优势 - 例如,您可能希望等待或处理计划具有一定程度的随机性,而 Cron 并不喜欢这种随机性。有时,这样的解决方案比 Cron 更好 - 但我认为这些是极端情况。

例如,如果您想要启动和停止该过程并拥有用户控制权,Upstart 可能是更好的选择。

答案2

当您希望某个进程在某个精确的绝对时间(即每天凌晨 3:15 或每小时 X:05 左右)执行时,可以使用 cron,而您的脚本则与您启动它的时间相关。在您的示例中,它将从您启动它的那一刻起每小时运行一次,这应该与启动顺序相对应。因此,如果您的 PC 在 1:05 启动,那么您的工作将在每个 X:05 完成,而如果它在 3:36 启动,那么您的工作将在 X:36 完成。

如果您只是希望它每小时执行一次,那么它实际上并没有改变,但当然它可能会在每小时的第一分钟和最后一分钟之间运行,具体取决于启动情况。实际上,如果您的 do_task 很长且需要很长时间,它甚至可能最终运行频率低于每小时一次(因为睡眠是在任务结束时计算的,因此如果 do_task 需要 30 分钟,那么在您的情况下 do_task 将每 1:30 小时启动一次)

另一方面,如果您的系统并非始终处于运行状态,使用 cron 可能会很容易丢失一些事件(因为它们仅在条件完全满足时才完成)。在这种情况下,更建议使用 anacron(因为它只查找上次执行的时间)。另一件事是,即使前一个实例尚未完成,cron 仍会执行该作业,这在某些情况下可能是好事也可能是坏事,而您的脚本则不会。

所以简而言之:如果您需要一个确定的并且知道时间,那么 cron 通常更好,如果您只需要一个没有具体时间的定期任务,那么您可以选择 upstart。

相关内容