【问题标题】:How to continuously show os command output in erlang?如何在erlang中连续显示os命令输出?
【发布时间】:2013-04-06 09:48:25
【问题描述】:

我需要在 erlang 中从 os 命令连续显示 stdout/stderr。 在 ruby​​ 中,我可以使用以下代码实现它:

s1, s2 , s3, t = Open3.popen3('for %a in (1 2 3 4 5 6 7 8 9) do (echo message & sleep 2 ) 2>&1 ')

s2.each do |l|
    puts l
end

它将“实时”显示“消息\n 消息\n” - 不等待进程结束。

我试过os:cmd(..)

1> P5 = erlang:open_port({spawn, "ruby rtest.rb"}, [stderr_to_stdout, in, exit_s
tatus, binary,stream, {line, 255}]).
#Port<0.505>
2> receive {P5, Data} -> io:format("Data ~p~n",[Data]) end.
Data {data,{eol,<<>>}}
ok

但他们都等待进程结束。

在 Erlang 中连续读取标准输出是否可选?

编辑: 换句话说,我在 erlang 中寻找一个 popen (c/c++; proc_open(php) 等) 函数

EDIT2 代码,适用于linux(在centos6.2上测试)。感谢vinod

-module(test).
-export([run/0]).


run() ->  
    P5 = erlang:open_port({spawn, "sh test.sh"}, 
    [stderr_to_stdout, in, exit_status,stream, {line, 255}]), 
    loop(P5).

loop(P) ->
       receive{P, Data} -> 
           io:format("Data ~p~n",[Data]),
       loop(P)
       end.

输出:

10> c(test).
{ok,test}
11> test:run().
Data {data,{eol,"1"}}
Data {data,{eol,"2"}}
Data {data,{eol,"3"}}
Data {data,{eol,"4"}}
Data {data,{eol,"5"}}
Data {data,{eol,"6"}}
Data {data,{eol,"7"}}
Data {data,{eol,"8"}}
Data {data,{eol,"9"}}
Data {data,{eol,"10"}}
Data {exit_status,0}

【问题讨论】:

    标签: operating-system erlang


    【解决方案1】:

    如果我理解正确,您希望继续与 os 命令同时执行您的程序。在 Erlang 中,您可以生成一个执行此操作的进程,然后您可以继续。例如

    1> spawn(fun() ->  
           P5 = erlang:open_port({spawn, "ruby rtest.rb"}, 
                                 [stderr_to_stdout, in, exit_status, 
                                  binary,stream, {line, 255}]), 
           receive {P5, Data} -> 
               io:format("Data ~p~n",[Data]) 
           end  
       end).
    <0.32.0>
    2> 5+5.
    10
    3>
    

    最好写在一个模块中,这样你可以更好地理解它。

    【讨论】:

    • 这不是我需要的。我需要在不等待命令结束的情况下获取命令输出。例如,页面顶部的 ruby​​ 代码允许在进程将其打印到自己的 stderr 或 stdout 的同时从打开的进程中打印输出行。
    • 上面的代码也做了同样的事情。生成的进程在生成进程(此处为 shell 进程)继续打印的同时打印输出。在这里,您正在创建另一个 Erlang 进程,它专门等待来自 OS 进程的数据并打印它,同时生成 Erlang 进程继续同时打印。
    • 在 Windows 7 x64 上试过。你用什么操作系统?
    • 在 centos6.2 上试过——你说的完全正确,它有效!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2020-01-09
    相关资源
    最近更新 更多