将iex会话附加到正在运行的elixir / OTP进程

时间:2016-07-20 22:03:26

标签: elixir otp iex

我有一个在生产中运行的elixir / OTP应用程序,它是以mix phoenix.server开头的。它有几个持有状态的进程。其中一个是作为代理实现的存储,当前有一个我想手动更改的状态,而不会停止整个应用程序。 一旦我在应用程序内部进行iex会话,这将是微不足道的,但我不知道在elixir中是否可以使用这样的选项?

1 个答案:

答案 0 :(得分:14)

这取决于你是如何启动OTP应用程序的。要连接到节点,需要使用--name--sname标志启动它。您可以使用node()

检查当前正在运行的会话的名称
$ iex
Erlang/OTP 18 [erts-7.2.1] [source] [64-bit] [smp:4:4] [async-threads:10] [kernel-poll:false]

Interactive Elixir (1.3.0) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> node()
:nonode@nohost

节点名称是一个原子,其中第一部分是实际节点名称,第二部分是主机。主机用于路由,因此很难连接到nohost上部署的节点。

如果您使用简称(iex)启动--sname,它会自动检测您的主机名。

$ iex --sname foo --cookie ciastko
(...)
iex(foo@MacBook-Pro-Tomasz)1> node
:"foo@MacBook-Pro-Tomasz"

在其他控制台上使用不同的名称和相同的Cookie运行iex并尝试Node.connect(:"foo@MacBook-Pro-Tomasz")。他们应该联系。

考虑到这一点,你可能没有启动你的凤凰应用程序,你现在无法连接。下次你需要运行时启动Phoenix这个可能性:

elixir --sname some_name --cookie ciastko -S mix phoenix.server