Tôi thực sự đang đấu tranh với các giám sát viên Elixir và tìm cách đặt tên cho họ để tôi có thể sử dụng chúng. Về cơ bản, tôi chỉ đang cố gắng bắt đầu một số Task
được giám sát mà tôi có thể gửi tin nhắn đến.Giám sát viên Elixir - Làm thế nào để bạn đặt tên một Nhiệm vụ được Giám sát
Vì vậy, tôi có như sau:
defmodule Run.Command do
def start_link do
Task.start_link(fn ->
receive do
{:run, cmd} -> System.cmd(cmd, [])
end
end)
end
end
với điểm vào dự án như:
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
Tại thời điểm này, tôi thậm chí không cảm thấy tự tin rằng mình đang sử dụng là điều đúng đắn (Task
cụ thể). Về cơ bản, tất cả những gì tôi muốn là để sinh ra một quá trình hoặc nhiệm vụ hoặc GenServer hoặc bất cứ điều gì là đúng khi ứng dụng bắt đầu mà tôi có thể gửi các thông điệp mà về bản chất sẽ làm một System.cmd(cmd, opts)
. Tôi muốn nhiệm vụ hoặc quy trình này được giám sát. Khi tôi gửi một tin nhắn {:run, cmd, opts}
như {:run, "mv", ["/file/to/move", "/move/to/here"]}
Tôi muốn nó sinh ra một nhiệm vụ hoặc quy trình mới để thực hiện lệnh đó. Để sử dụng, tôi thậm chí không cần lấy lại phản hồi từ nhiệm vụ, tôi chỉ cần nó thực hiện. Bất kỳ hướng dẫn về nơi để đi sẽ là hữu ích. Tôi đã đọc qua hướng dẫn bắt đầu nhưng thực sự nó khiến tôi bối rối hơn bởi vì khi tôi cố gắng làm những gì được thực hiện nó không bao giờ quay ra như trong ứng dụng.
Cảm ơn sự kiên nhẫn của bạn.
Đó là giải pháp hoàn hảo. Lý do tại sao bạn không thể đặt tên cho Task là vì nếu bạn muốn gửi tin nhắn ... bạn không muốn sử dụng Task nữa. –
Cảm ơn bạn đã giải thích chi tiết này. Điều này rất hữu ích cho tôi @bitwalker. Cảm ơn bạn đã dành thời gian, hỗ trợ và kiên nhẫn. – kkirsche
@bitwalker Khi cố gắng sử dụng điều này, tôi nhận được một thời gian chờ GenServer.call. Không nên người giám sát ngăn chặn loại điều này xảy ra? (thoát) đã thoát trong: GenServer.call (Chạy.Command, {: run, "ls", ["."]}, 5000) ** (EXIT) hết giờ (elixir) lib/gen_server.ex: 356 : GenServer.call/3 – kkirsche