Elixir :invalid_child_spec for supervised process. 不知道为什么

标签 elixir otp

我正在第一次实现主管,但遇到了无法从文档中弄清楚的问题。具体来说,当我尝试使用 SlowRamp.flood 开始我的进程时我收到 {:error, {:invalid_child_spec, []}} .

这是一个非常简单的应用程序,是使用 mix new slow_ramp --sup 制作的。

主文件在./lib/slow_ramp.ex是:

defmodule SlowRamp 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 = [
      worker(SlowRamp.Flood, [])
    ]

    # See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
    # for other strategies and supported options
    opts = [strategy: :one_for_one, name: SlowRamp.Supervisor]
    Supervisor.start_link(children, opts)
  end

  def flood do
    Supervisor.start_child(SlowRamp.Supervisor, [])
  end
end

我的子函数/文件在 ./lib/SlowRamp/flood.ex看起来像这样:
defmodule SlowRamp.Flood do
  def start_link do
    Task.start_link(fn -> start end)
  end

  defp start do
    receive do
      {:start, host, caller} ->
        send caller, System.cmd("cmd", ["opt"])
    end
  end
end

任何帮助将不胜感激。谢谢!

最佳答案

问题出在

Supervisor.start_child(SlowRamp.Supervisor, [])

您需要一个有效的子规范,例如:
def flood do
  import Supervisor.Spec
  Supervisor.start_child(SlowRamp.Supervisor, worker(SlowRamp.Flood, [], [id: :foo]))
end

这就是它告诉子规范无效的原因

关于Elixir :invalid_child_spec for supervised process. 不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31320344/

相关文章:

architecture - 使用 OTP/Erlang 作为 Web 应用程序基于组件的架构的一部分

Elixir - 函数定义的语法是什么?

elixir - 如何在 Elixir Repo.Transaction 中添加 COPY FROM STDIN

phoenix-framework - 生成的新 Controller 在 phoenix-elixir 中不起作用?

elixir - Elixir 如何读取远程节点 mnesia 表

erlang OTP 主管崩溃

erlang - 在 erlang/OTP 中,如何启动 appmon 来监视现有节点?

erlang - simple_one_for_one start_child()返回has_started

elixir - 如何检查 eex 中是否存在变量?