关闭:无法启动子项:Phoenix/Elixir 中的 MyApp.Endpoint

5 elixir phoenix-framework

在我的 phoenix 应用程序中,当我运行 Phoenix 控制台时,我在服务器和本地出现此错误:

[info] Application MyApp exited: MyApp.start(:normal, []) returned an error: shutdown: failed to start child: MyApp.Endpoint
    ** (EXIT) already started: #PID<0.1012.0>
{"Kernel pid terminated",application_controller,"{application_start_failure,MyApp,{{shutdown,
{failed_to_start_child,'Elixir.MyApp.Endpoint',
{already_started,<0.1012.0>}}},{'Elixir.MyApp',start,[normal,[]]}}}"}

Crash dump is being written to: erl_crash.dump...done
Kernel pid terminated (application_controller) ({application_start_failure,MyApp,{{shutdown,{failed_to_start_child,'Elixir.MyApp.Endpoint',{already_started,<0.1012.0>}}},{'Elixir.MyApp',start,[no....
Run Code Online (Sandbox Code Playgroud)

那是关于什么的?如何解决?

更新:

这是完整的混淆堆栈跟踪:

$ ./bin/my_app console     
Using /home/my_name/my_app_com_webite2/releases/0.0.2/my_app.sh
Exec: /home/my_name/my_app_com_webite2/erts-7.3.1/bin/erlexec -boot /home/my_name/my_app_com_webite2/releases/0.0.2/my_app -mode embedded -config /home/my_name/my_app_com_webite2/running-config/sys.config -boot_var ERTS_LIB_DIR /home/my_name/my_app_com_webite2/erts-7.3.1/../lib -env ERL_LIBS /home/my_name/my_app_com_webite2/lib -pa /home/my_name/my_app_com_webite2/lib/my_app-0.0.2/consolidated -args_file /home/my_name/my_app_com_webite2/running-config/vm.args -user Elixir.IEx.CLI -extra --no-halt +iex -- console
Root: /home/my_name/my_app_com_webite2
/home/my_name/my_app_com_webite2
Erlang/OTP 18 [erts-7.3.1] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]

[info] Application my_app exited: my_app.start(:normal, []) returned an error: shutdown: failed to start child: my_app.Endpoint
    ** (EXIT) already started: #PID<0.1012.0>
{"Kernel pid terminated",application_controller,"{application_start_failure,my_app,{{shutdown,{failed_to_start_child,'Elixir.my_app.Endpoint',{already_started,<0.1012.0>}}},{'Elixir.my_app',start,[normal,[]]}}}"}

Crash dump is being written to: erl_crash.dump...done
Kernel pid terminated (application_controller) ({application_start_failure,my_app,{{shutdown,{failed_to_start_child,'Elixir.my_app.Endpoint',{already_started,<0.1012.0>}}},{'Elixir.my_app',start,[no
Run Code Online (Sandbox Code Playgroud)

我创建了它的发布mix clean, compile, release

更新2:

# lib/my_app
defmodule MyApp123 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 = [
      supervisor(MyApp123.Endpoint, []),
      supervisor(MyApp123.Repo, []),
    ]


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

  # Tell Phoenix to update the endpoint configuration
  # whenever the application is updated.
  def config_change(changed, _new, removed) do
    MyApp123.Endpoint.config_change(changed, removed)
    :ok
  end
end
Run Code Online (Sandbox Code Playgroud)

tko*_*wal 2

这意味着您可能MyApp.Endpoint在某个地方手动启动。你的内部lib/my_app.ex应该有一段这样的代码。

children = [
  # Start the endpoint when the application starts
  supervisor(MyApp.Endpoint, []),
  # Start the Ecto repository
  supervisor(MyApp.Repo, []),
  # Here you could define other workers and supervisors as children
  # worker(MyApp.Worker, [arg1, arg2, arg3]),
]
Run Code Online (Sandbox Code Playgroud)

这段代码的意思是启动MyApp需要starting Endpoint。监管树对秩序确实很严格。他们需要监视已启动的进程,因此如果其他人启动了该进程,他们将返回错误。这会关闭MyApp整个虚拟机,因为在没有主应用程序的情况下运行它是没有意义的。Endpoint.start尝试在代码中的某个位置查找调用。