3

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で継続的にstdoutを読み取るためのオプションはありますか?

編集: つまり、erlang で popen (c/c++; proc_open(php) など) 関数を探します。

Linuxで動作するEDIT2コード( 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}
4

1 に答える 1