Я действительно борюсь с супервизорами Elixir и придумываю, как назвать их, чтобы я мог их использовать. По сути, я просто пытаюсь запустить контролируемый Task
, которому я могу отправлять сообщения.
Итак, у меня есть следующее:
defmodule Run.Command do
def start_link do
Task.start_link(fn ->
receive do
{:run, cmd} -> System.cmd(cmd, [])
end
end)
end
end
с точкой входа в проект как:
defmodule Run do
use Application
# See http://elixir-lang.org/docs/stable/elixir/Application.html
# for more information on OTP Applications
def start(_type, _args) do
import Supervisor.Spec, warn: false
children = [
# Define workers and child supervisors to be supervised
worker(Run.Command, [])
]
# See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: Run.Command]
Supervisor.start_link(children, opts)
end
end
На данный момент я даже не уверен, что использую то, что нужно (конкретно Task
). По сути, все, что я хочу, - это создать процесс или задачу, или GenServer, или что-то еще, что нужно, при запуске приложения, чтобы я мог отправлять сообщения, которые, по сути, будут делать System.cmd(cmd, opts)
. Я хочу, чтобы эта задача или процесс контролировались. Когда я отправляю ему {:run, cmd, opts}
сообщение, например {:run, "mv", ["/file/to/move", "/move/to/here"]}
, я хочу, чтобы он порождал новую задачу или процесс для выполнения этой команды. Для моего использования мне даже не нужно когда-либо возвращать ответ от задачи, мне просто нужно, чтобы он выполнялся. Любые советы о том, куда идти, были бы полезны. Я прочитал руководство по началу работы, но, честно говоря, это оставило меня в еще большем замешательстве, потому что, когда я пытаюсь сделать то, что сделано, никогда не получается, как в приложении.
Спасибо за терпеливость.