如何重新启动节点并捕获其I / O,就好像以iex开头一样?

时间:2017-09-05 18:20:44

标签: elixir

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

如果我启动我的应用程序分离,然后remsh进入它,我怎么能看到相同的输出。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我在这里寻找的是来自@bitwalker酿酒厂软件包中用于发布管理的attach发布任务。

https://github.com/bitwalker/distillery/blob/6700edb017804e51aec14dedb8df888d1db4e63c/priv/libexec/commands/help.sh