无法在未运行 phx.server 的情况下运行 cron 任务



我正在台式计算机(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)

问题是它与服务器一起运行,因此每当计算机进入睡眠模式时,它就会停止运行。

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

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

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

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

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

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

相关内容

最新更新