无法 运行 没有 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 来为您的项目打包发布,但这可能有点过分了。
我正在我的台式计算机 (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 来为您的项目打包发布,但这可能有点过分了。