Naprawdę walczę z opiekunami Elixir i zastanawiam się, jak je nazwać, aby móc z nich korzystać. Zasadniczo próbuję uruchomić nadzorowaną wersję Task
, do której mogę wysyłać wiadomości.Elixir Supervisors - Jak nazwać nadzorowane zadanie
Więc mam następujące:
defmodule Run.Command do
def start_link do
Task.start_link(fn ->
receive do
{:run, cmd} -> System.cmd(cmd, [])
end
end)
end
end
z punktu wejścia projekt jako:
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
W tym momencie, nawet nie czuć się pewnie, że używam uszne (Task
w szczególności). Zasadniczo wszystko, czego chcę, to odrodzenie procesu lub zadania lub GenServer lub cokolwiek jest w porządku, gdy aplikacja się rozpocznie, że mogę wysyłać wiadomości, które w istocie robią System.cmd(cmd, opts)
. Chcę, aby to zadanie lub proces był nadzorowany. Kiedy wysyłam wiadomość o numerze {:run, cmd, opts}
, taką jak {:run, "mv", ["/file/to/move", "/move/to/here"]}
, chcę, aby uruchomiła nowe zadanie lub proces, aby wykonać to polecenie. Do mojego użytku, nawet nie potrzebuję odzyskać odpowiedzi z zadania, po prostu potrzebuję go do wykonania. Pomocne będą wskazówki dotyczące tego, gdzie się udać. Przeczytałem poradnik dla początkujących, ale szczerze mówiąc, bardziej mnie to zdziwiło, ponieważ kiedy próbuję robić to, co się robi, nigdy się tak nie dzieje, jak w aplikacji.
Dziękuję za cierpliwość.
To idealne rozwiązanie. Powodem, dla którego nie możesz nazwać zadania, jest to, że jeśli chcesz wysłać mu wiadomości ... nie chcesz już używać zadania. –
Dziękuję za wyjaśnienie tego w taki sposób. To było bardzo pomocne dla mnie. Dziękuję za poświęcony czas, pomoc i cierpliwość. – kkirsche
@bitwalker Podczas próby użycia tego otrzymuję limit czasu GenServer.call. Czy nadzorca nie powinien zapobiegać temu, aby coś takiego się wydarzyło? (exit) zakończone w: GenServer.call (Run.Command, {: run, "ls", ["."]}, 5000) ** (EXIT) limit czasu (eliksir) lib/gen_server.ex: 356 : GenServer.call/3 – kkirsche