elixir - 如何重新进入节点并捕获其 I/O,就像使用 iex 启动一样?

标签 elixir

如果我使用 iex 启动应用程序,我将在控制台看到应用程序的日志语句。

如果我以分离方式启动应用程序,然后 remsh 进入其中,我如何才能看到相同的输出。

最佳答案

默认情况下,从远程 shell 执行的任何操作都会将其组领导者设置为 shell 的组领导者,因此 I/O 将按预期工作。

对于从主节点启动的进程,它们的组领导者已经设置,因此它们的 I/O 不会被重定向到远程 shell。您可以使用 Process.group_leader/2 设置进程的组长,例如:Process.group_leader(pid, Process.group_leader())这将设置 pid 的组长给当前进程的组长。您可以配置:console Logger 的后端也可以使用 Logger.configure_backend(:console, [device: Process.group_leader()]) 重定向到您的 shell 。之后,所有控制台记录器输出都应定向到您的远程 shell。

执行此操作时要非常小心。如果您在会产生大量输出的应用程序上执行此操作,则您将面临组领导者过载的风险,这可能会导致其崩溃,从而导致任何问题尝试写入它 - 当您在远程节点上分配组领导时,这样做的可能性会增加。我建议只在实验或开发过程中这样做。在生产中,您可能应该将日志写入文件,并且通过 ssh 被动跟踪这些日志比将记录器的组领导更改为远程 shell 更安全 - 特别是如果您在不更改组领导的情况下杀死 shell后退;这将导致任何尝试写入组领导者的进程崩溃。您还需要小心,在更改流程之前存储流程的组长,以便确保将其改回正确的组长。

关于elixir - 如何重新进入节点并捕获其 I/O,就像使用 iex 启动一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46061137/

相关文章:

docker - Elixir和Docker

elixir - 如何从连接中获取请求正文?

elixir - 清理 ExUnit 测试示例

sorting - Elixir 如何对列表理解进行排序?

elixir - Elixir `Any` 中的 `defprotocol` 实际上包含什么?

elixir - 如何在 elixir 模块中创建全局变量

elixir - Phoenix 框架中的动态模型

build - 更改 Mix 使用的 _build dir 的位置

elixir - 无法调用任务 "distillery.release"

erlang - 为远程 erlang 节点运行观察者 : making it simpler