【问题标题】:Infinte loop vs cron job无限循环与 cron 作业
【发布时间】:2020-03-09 21:41:51
【问题描述】:

我有一个上传服务,它需要每 5 分钟运行一次,并且肯定会在 5 分钟内完成,所以永远不会有两个并行会话。

想知道什么是运行它的好策略,要么将它安排为主机上的 cron 作业,要么启动一个无限循环的 go 程序,该程序执行程序并休眠(Golang: Implementing a cron / executing tasks at a specific time)

【问题讨论】:

  • cron作业可以省去监控和重启长时间运行的进程。
  • @iLoveReflection 进程管理器也可以,比如 upstart 或 systemd。
  • 如果您不在乎它运行的具体时间,只关心它每五分钟运行一次,那么链接的解决方案就太过分了。您可以只使用 Ticker 并在几行代码中完成。

标签: linux go


【解决方案1】:

如果你的任务是……

  • 在 Unix 上
  • 独立
  • 定期
  • 具有可接受的启动时间

cron 将比为一项服务滚动您自己的调度程序更好。它将保证该过程将始终在正确的时间运行并具有基本的错误报告。如果你的无限循环出现错误,则无需添加看门狗,cron 将在 5 分钟后再次运行该过程。

如果cron 不足,请先查看其他job schedulers,然后再自行滚动。

我有一个上传服务,它需要每 5 分钟运行一次,而且肯定会在 5 分钟内完成,所以永远不会有两个并行会话。

这些是著名的遗言。我建议添加某种形式的锁定。例如,将您的PID to a file 写入/var/run 并检查该进程是否正在运行。甚至还有little pidfile library for Go

【讨论】:

  • “为一项服务滚动你自己的调度程序”听起来比实际工作要多得多。每 5 分钟重复一次的任务是 Go 中的两三行代码。见golang.org/pkg/time/#Tick
  • @Adrian 如果进程死了怎么办?还是泄漏内存?还是系统重启?或者如果它需要在不同的时期运行?还是只在工作日?
  • 按顺序:流程管理器;任何东西都可能有错误;流程经理;这超出了所要求的范围;这也超出了所要求的范围。所有这些似乎都与我的观点无关 - 你的回答暗示编写一个每五分钟执行一次(被问到的事情)的 Go 程序会有点负担,而实际上它是微不足道的。
  • @Adrian 问题是关于无限循环与作业调度程序。复制适当的作业调度程序的功能和可靠性需要的不仅仅是 Tick。如果您觉得我们有误,请写下您的答案。
  • @Adrian 考虑目标是可靠且自动每 5 分钟运行一次进程。手动检查进程管理器以查看它是否挂起、死亡或重新启动都不是。正是因为任何事情都可能存在错误,因此流程需要考虑特殊情况。一个好的作业调度程序和 PID 锁定文件将可靠地每 5 分钟运行一次进程,无论它是挂起、死亡还是系统重新启动。它将处理重叠。 AFAIK Ticker 不会那样做。我可能是错的,Go 非常棒,所以我期待你的回答。
【解决方案2】:

看看 Systemd,你可以执行带有计时器的脚本并设置脚本的最大执行时间。

https://wiki.archlinux.org/index.php/Systemd/Timers

【讨论】:

    猜你喜欢
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多