【erlang】linuxコマンドを実行する2つの方法

2888 ワード

os.cmd(Cmd)


osモジュールは、linuxシステムshellコマンド(windowsコマンド)を実行できるcmd関数を提供します.Cmdコマンドの標準出力文字列の結果を返します.例えばlinuxシステムでos:cmd(「date」)を実行する.linuxの時間を返します.これは比較的簡単で、一般的には、ほとんどのニーズを満たしています.
 

erlang:open_port(PortName, PortSettings)


os.cmd(Cmd)があなたのニーズを満たすことができない時、強大なopen_を使うことができますport(PortName,PortSettings)で解決しました.最も簡単なニーズは、linuxコマンドを実行し、終了コードを返す必要があります.os.cmd(Cmd)は少し急いでいます.openがあるとは思わないでport(PortName,PortSettings)はosに完全に代わることができる.com(Cmd)になりました.強さには代価が必要だ.
%%の利点:exit statusと実行プロセスを返すことができます%%の欠点:パフォーマンスに非常に影響しますopen_port実行時smpが詰まる
自分のシステムの性能に対する要求が比較的高い場合、erlang:open_の使用は推奨されません.port(PortName, PortSettings) .
次は使いやすいコードで、exit statusと実行結果を返します.
 
my_exec(Command) ->
    Port = open_port({spawn, Command}, [stream, in, eof, hide, exit_status]),
    Result = get_data(Port, []),
    Result.

get_data(Port, Sofar) ->
    receive
    {Port, {data, Bytes}} ->
        get_data(Port, [Sofar|Bytes]);
    {Port, eof} ->
        Port ! {self(), close},
        receive
        {Port, closed} ->
            true
        end,
        receive
        {'EXIT',  Port,  _} ->
            ok
        after 1 ->              % force context switch
            ok
        end,
        ExitCode =
            receive
            {Port, {exit_status, Code}} ->
                Code
        end,
        {ExitCode, lists:flatten(Sofar)}
    end.

 
 
参照ドキュメント:
http://erlang.org/doc/man/os.html#cmd-1
http://erlang.org/doc/man/erlang.html#open_port-2