Как я могу настроить обратный вызов для запуска до закрытия сеанса IEx?

#elixir #elixir-iex

#elixir #elixir-iex

Вопрос:

Я хочу настроить некоторый код очистки для запуска до того, как пользователь завершит сеанс REPL, с которого начался iex -S mix .

Я ожидал, что запуск:

 System.at_exit fn (_) -> File.write! "afile", "it works" end
  

внутри сеанса iex для создания файла с именем afile , но, похоже, этого не происходит.

Чтобы быть немного более конкретным в отношении того, чего я пытаюсь достичь, я запускаю системный процесс внутри REPL (используя System.cmd/2 ), и я хочу iex , чтобы этот процесс был завершен при завершении процесса.

Комментарии:

1. Взлом поведения консоли erlang (а Elixir просто выводит консоль erlang для IEx ) слишком громоздок и даже часто невозможен. Если единственное, что вам нужно, это отсоединить процесс, то отсоединить процесс будет намного проще. Можно запустить процесс с завершающим амперсандом ls amp; или даже использовать nohup .

2. @mudasobwa но я не хочу отсоединять процесс, я хочу иметь возможность завершить его непосредственно перед завершением моего процесса erlang.

3. @mudasobwa Я все еще вижу, что процесс yes запущен после выхода iex из using Ctrl-C Ctrl-C .

4. @Dogbert iex(1)> System.cmd "yes", [] BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded (v)ersion (k)ill (D)b-tables (d)istribution ^C/usr/bin/yes: % standard output: Broken pipe . Я что-то упускаю?

5. @mudasobwa Похоже, что-то отличается в Linux и OSX yes (я вижу то же поведение, что и у вас в Linux). В любом случае, попробуйте System.cmd "sleep", ["120"] — я вижу одинаковое поведение для этого как в Linux, так и в OSX — sleep продолжает работать даже после выхода iex .