无法 运行 没有 phx.server 运行ning 的 cron 任务

Unable to run cron tasks without phx.server running

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

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)

问题出在服务器 运行s 上,因此只要计算机进入睡眠模式,它就会停止 运行ning。

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

您可以为 OSX 设置定时唤醒和睡眠,这样可以解决您的睡眠问题。您还可以将 "real" cron 作业协调到 运行 同一 window 中的脚本。

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

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

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

根据完整解决方案的复杂性,您可能希望查看 Distillery 来为您的项目打包发布,但这可能有点过分了。