【问题标题】:In Erlang, how can I independently capture stdout and stderr of a subprocess?在 Erlang 中,如何独立捕获子进程的 stdout 和 stderr?
【发布时间】:2016-02-25 16:04:13
【问题描述】:

我试图弄清楚如何从 Erlang 的系统子进程中提取标准输出和标准错误。 (不要与 Erlang 进程混淆。)问题是我正在尝试独立提取流的输出。

open_port/2 似乎让我了解了大部分情况,但它似乎没有提供区分两个流的方法。有 stderr_to_stdout 选项,但这不是我想要的;我想从两个数据流中获取数据,但能够区分这两个流。

有什么建议吗?谢谢。

更新:理想情况下,我正在寻找一种适用于 Windows 和 Linux 的解决方案。

【问题讨论】:

    标签: erlang


    【解决方案1】:

    试试这个:

    Path = filename:join(["./priv", "log", "log_file_name"]),
    {ok, F} = file:open(Path, [write]),
    group_leader(F, self()),
    erlang:display("Anything this process outputs now gets redirected").
    

    【讨论】:

    • 我要知道的有趣和好的知识......但问题是关于捕获外部进程的标准输出/标准错误,而不是 Erlang 进程。
    • 我认为您可以考虑将问题编辑为“来自使用 Erlang 的系统进程”与“来自 Erlang 中的子进程”,因为这可能会混淆未来的 Googlies。
    • 是的,我认为这很公平。
    【解决方案2】:

    您可能想试试erlexec。正如its documentation 解释的那样,它允许对stdout 和stderr 进行单独控制,并且通常比open_port/2 更灵活地管理来自Erlang 的操作系统进程。

    【讨论】:

    • 嗯...这看起来很有希望。我在问题中没有提到的一部分是我正在寻找一种适用于 Windows 和 Linux 的解决方案; erlexec 似乎不“支持”Windows。尽管不受支持,我仍然会尝试看看它是否有效。
    • ...答案是“不”。需要添加支持。哪个可能最终成为答案;希望有一个更简单的选择...
    • 基于其他人没有回应,将考虑与 Windows 兼容的解决方案作为可能的差距。撇开 Windows 不谈,erlexec 看起来确实很合适,因此我会接受它作为答案。
    • 另外,现在学习了更多 Erlang,我可能的解决方案是:用另一种语言(例如 Python)创建一个小程序,并使用 spawn_executable 和 use_stdio 选项通过 open_port/2 进行通信。我可以通过中间模块捕获我需要的内容,将其编码为 JSON,然后通过中间模块的标准输出将其吸入 Erlang。缺点是我依赖于 Erlang 和我想从中捕获输出的子进程之间的“外部”程序……但这并不是特别难,而且让我懒惰而不是将 erlexec 移植到 Windows。 :-)
    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 2015-03-16
    • 2018-08-05
    • 2013-09-02
    • 2013-01-12
    • 1970-01-01
    • 2013-08-26
    • 2023-04-06
    相关资源
    最近更新 更多