用户登录
用户注册

分享至

Erlang中执行linux命令的两种方法

  • 作者: 疯狂小马一
  • 来源: 51数据库
  • 2021-07-03

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.

软件
前端设计
程序设计
Java相关