2
我需要从erlang的os命令不断显示stdout/stderr。 在红宝石我可以用下面的代码实现:如何在erlang中连续显示os命令输出?
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中的连续标准输出是否可选?
编辑: 换句话说我寻找一个POPEN(C/C++; proc_open(PHP)与等)功能中的erlang
EDIT2 代码,在Linux的工作原理(上centos6测试0.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}
那不是我需要的。我需要在不等待命令结束的情况下获得命令输出。例如,页面顶部的ruby代码允许从打开的进程打印输出行,同时进程将其打印到自己的stderr或stdout。 – rdo 2013-04-05 14:47:22
上面的代码也做同样的事情。生成的过程在产卵过程(此处为shell过程)继续打印的同时打印输出。在这里,您正在创建另一个Erlang进程,它专门等待来自OS进程的数据并打印出来,同时产生Erlang进程继续同时打印。 – Vinod 2013-04-05 19:01:31
尝试在Windows 7 x64上。你使用什么操作系统? – rdo 2013-04-06 01:29:35