Erlang中执行linux命令的两种方法
os.cmd(Cmd)
os模块提供了cmd函数可以执行linux系统shell命令(也可以执行windows命令)。返回一个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执行的时候,beam.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.
相关推荐
chenpro 2020-08-09
NVEFLY 2020-07-04
liym 2020-06-21
OnMyHeart 2020-06-06
天空windy 2020-06-03
87447007 2020-05-16
OnMyHeart 2020-05-09
NVEFLY 2020-04-17
M守护神 2020-03-28
大史哥哥 2020-03-07
wbingyang 2020-02-27
liym 2020-02-22
zhoucheng0 2020-02-19
wbingyang 2020-02-14
OnMyHeart 2020-01-14
OnMyHeart 2020-01-08
大史哥哥 2019-12-31
wbingyang 2019-12-31