【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