Выпуск микса start_iex показывает ошибку, а запуск - нет

Фон

Я создаю выпуск зонтичного приложения через mix release. Однако, хотя я могу запустить приложение вручную, при его запуске возникают некоторые ошибки.

mix release

Я пытаюсь запустить приложение с mix release. Эта команда отлично работает и создает исполняемый файл в _build/prod/rel/my_app/bin/my_app. Я могу запустить этот исполняемый файл с помощью команды start, и все работает нормально.

Однако, если вместо start я использую start_iex, я сначала получаю сообщение об ошибке, а затем приложение работает нормально:

$ _build/prod/rel/my_app/bin/my_app start_iex
Erlang/OTP 22 [erts-10.5] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [hipe]

*** ERROR: Shell process terminated! (^G to start new job) ***
Erlang/OTP 22 [erts-10.5] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [hipe]

my_app - это зонтичное приложение. Вот mix.exs содержимое зонтичного приложения:

defmodule MyApp.MixProject do
  use Mix.Project

  def project do
    [
      apps_path: "apps",
      version: "0.1.0",
      start_permanent: Mix.env() == :prod,
      deps: deps(),
      elixir: "~> 1.10",
      releases: releases()
    ]
  end

  defp deps, do: []

  defp releases, do:
    [
      my_app: [
        applications: [
          api: :permanent,
          core: :permanent,
          storage: :permanent
        ]
      ]
    ]
end

Вопрос

  1. Почему я получаю сообщение об ошибке при использовании start_iex, а не при использовании start?
  2. Почему start_iex работает после ошибки?

person Flame_Phoenix    schedule 03.11.2020    source источник
comment
github.com/elixir-lang/elixir/issues/9164   -  person vinibrsl    schedule 06.11.2020
comment
Спасибо! если вы поставите это как ответ, я приму это!   -  person Flame_Phoenix    schedule 19.11.2020


Ответы (1)


Это состояние гонки, когда у вас включена история оболочки. Здесь есть открытый отчет .

Поскольку disk_log запускается после пользовательского процесса, существует вероятность состояния гонки при завершении работы, когда disk_log завершится до того, как группа, которая не сможет войти в журнал.

Более того, если disk_log завершается ДО запуска оболочки, вся оболочка не запускается, что рекурсивно запускает другую оболочку, пока система не завершит работу. Это можно воспроизвести с помощью этой команды:

$ erl -kernel shell_history true -s init restart

person vinibrsl    schedule 19.11.2020