【问题标题】:Unable to run cron tasks without phx.server running无法在没有 phx.server 运行的情况下运行 cron 任务
【发布时间】:2019-02-23 17:03:49
【问题描述】:

我正在我的台式计算机 (Mac OS) 上开发一个应用程序,为此我创建了一些每 5 分钟运行一次的 cron 任务。代码如下(取自here):

defmodule MyApp.CronJobs do
  use GenServer

  @shops ["billa","kaufland","lidl"] 

  def start_link do
    GenServer.start_link(__MODULE__, %{})
  end

  def init(state) do
    schedule_work() # Schedule work to be performed at some point
    {:ok, state}
  end

  def handle_info(:work, state) do
    Enum.each(@shops, &monitor_prices/1)
    schedule_work() # Reschedule once more
    {:noreply, state}
  end

  defp monitor_price(shop)
    Mix.Task.run "monitor.#{shop}.all_prices"
  end

  defp schedule_work() do
    Process.send_after(self(), :work, 5 * 60 * 1000)
  end
end

在监督树上:

  ...
  children = [
    supervisor(MyApp.CronJobs, [])
    ...
  ]
  opts = [ strategy: :one_for_one, name: MyApp.Supervisor]
  Supervisor.start_link(children, opts)

问题在于它与服务器一起运行,因此只要计算机进入睡眠模式,它就会停止运行。

有没有办法让进程在后台永久运行,而无需让计算机一直处于全功率模式?更好的是,有没有办法在不运行服务器的情况下每 5 分钟触发一次混合任务?

【问题讨论】:

  • 睡眠有点类似于关闭计算机,并且无法在睡眠模式下运行任何进程,因为所有进程都已暂停,因此如果要保持任务运行,则必须禁用睡眠模式并始终保持开启状态。或者在某处部署您的应用程序。为什么你需要在开发模式下运行所有​​这些任务?顺便说一句,你这里根本没有使用 cron,这是 BEAM 的内部进程调度
  • 我知道这不是真正的 cron 工作,但他们管理相同的 @BogdanAgafonov 。理想情况下,我想在某个时间间隔触发混合任务,而无需运行服务器,但我不知道如何在 elixir 应用程序中实现这一点。
  • 您想将某些东西作为“守护进程”运行。最简单的方法可能是将您的代码转换为混合任务并使用 CRON,但您也可以查看 distillery 版本 + sysctl 或其他守护程序。您也可以直接使用 sysctl 和 iex 在后台运行它。

标签: elixir phoenix-framework cron-task elixir-mix


【解决方案1】:

您可以使用预定的唤醒和睡眠对 OSX 进行编程,这样可以解决您的睡眠问题。您还可以协调“真正的”cron 作业以在同一窗口中运行任一脚本。

混合任务的问题在于它们通常从项目的根文件夹运行,因为它们需要项目的上下文来运行。这不是真正的“生产”解决方案。您安装一个可以从任何目录运行的存档,但有更好的方法。

看看脚本。您为混合项目构建一个 escript 并将其安装在您的系统上。然后,您可以从计划的 cron 作业中运行 escript。

我怀疑您的解决方案中是否需要 GenServer,因为您上面的示例没有使用任何持久状态。如果您需要并发,您可以简单地生成一些进程或使用 Task 来运行一些并发代码。

根据您的完整解决方案的复杂性,您可能希望查看 Distillery 为您的项目打包一个版本,但这可能有点矫枉过正。

【讨论】:

    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    • 2015-03-02
    • 1970-01-01
    • 2022-12-15
    • 2017-06-05
    相关资源
    最近更新 更多