将 iex 会话附加到 运行 elixir/OTP 进程
Attach an iex session to running elixir/OTP process
我在生产中有一个 elixir/OTP 应用程序 运行,它是从 mix phoenix.server
开始的。它有几个保持状态的进程。其中之一是作为 Agent 实现的存储,它当前具有我想手动更改的状态,而无需停止整个应用程序。
一旦我进入应用程序内的 iex 会话,这将是微不足道的,但我不知道在 elixir 中是否可以使用这样的选项?
这取决于您是如何启动 OTP 应用程序的。要连接到节点,需要使用 --name
或 --sname
标志启动。您可以使用 node()
查看当前 运行ning 会话的名称
$ 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
.
上的节点
如果您以短名称 (--sname
) 开头 iex
,它会自动检测您的主机名。
$ iex --sname foo --cookie ciastko
(...)
iex(foo@MacBook-Pro-Tomasz)1> node
:"foo@MacBook-Pro-Tomasz"
在其他控制台 运行 iex
上使用不同的名称和相同的 cookie 并尝试 Node.connect(:"foo@MacBook-Pro-Tomasz")
。他们应该连接。
您可能没有考虑到这一点来启动您的 phoenix 应用程序,您现在无法连接。下次需要以这种可能性启动 Phoenix 运行:
elixir --sname some_name --cookie ciastko -S mix phoenix.server
我在生产中有一个 elixir/OTP 应用程序 运行,它是从 mix phoenix.server
开始的。它有几个保持状态的进程。其中之一是作为 Agent 实现的存储,它当前具有我想手动更改的状态,而无需停止整个应用程序。
一旦我进入应用程序内的 iex 会话,这将是微不足道的,但我不知道在 elixir 中是否可以使用这样的选项?
这取决于您是如何启动 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
.
如果您以短名称 (--sname
) 开头 iex
,它会自动检测您的主机名。
$ iex --sname foo --cookie ciastko
(...)
iex(foo@MacBook-Pro-Tomasz)1> node
:"foo@MacBook-Pro-Tomasz"
在其他控制台 运行 iex
上使用不同的名称和相同的 cookie 并尝试 Node.connect(:"foo@MacBook-Pro-Tomasz")
。他们应该连接。
您可能没有考虑到这一点来启动您的 phoenix 应用程序,您现在无法连接。下次需要以这种可能性启动 Phoenix 运行:
elixir --sname some_name --cookie ciastko -S mix phoenix.server