Невозможно запустить задачи cron без запуска phx.server - PullRequest
0 голосов
/ 19 сентября 2018

Я разрабатываю приложение на своем настольном компьютере (Mac OS), для которого я создал несколько задач cron, которые запускаются каждые 5 минут.Код следующий (взято из здесь ):

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

В дереве Supervision:

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

Проблема заключается в том, что это работает с сервером, поэтому всякий раз, когдакомпьютер переходит в спящий режим, он перестает работать.

Есть ли способ, чтобы процессы работали в фоновом режиме постоянно, не имея компьютера все время в режиме полной мощности?Более того, есть ли способ запускать смешанные задачи каждые 5 минут без запуска сервера?

1 Ответ

0 голосов
/ 21 сентября 2018

Вы можете запрограммировать OSX с помощью запланированного пробуждения и сна, чтобы решить вашу проблему со сном.Вы также можете координировать «реальное» задание cron для запуска сценария в одном и том же окне.

Проблема с задачами смешивания заключается в том, что они обычно запускаются из корневой папки проекта, так как им нужен контекст проекта длязапустить.Это не совсем «производственное» решение.Вы устанавливаете архив, который будет работать из любого каталога, но есть лучший способ.

Взгляните, эскрипты.Вы создаете сценарий для смешанного проекта и устанавливаете его в своей системе.Затем вы можете запустить escript из запланированного задания cron.

Я сомневаюсь, что вам понадобится GenServer в вашем решении, поскольку в приведенном выше примере не используется какое-либо постоянное состояние.Если вам нужен параллелизм, вы можете просто запустить некоторые процессы или использовать Task для запуска некоторого параллельного кода.

В зависимости от сложности вашего полного решения, вы можете обратиться к Distillery, чтобы упаковать релиз для вашего проекта,но это может быть излишним.

...