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

 更新时间:2015年01月07日 10:51:03   投稿:junjie  
这篇文章主要介绍了Erlang中执行linux命令的两种方法,本文着重讲解了erlang:open_port的使用,需要的朋友可以参考下

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.

相关文章

  • Erlang语法学习笔记:变量、原子、元组、列表、字符串

    Erlang语法学习笔记:变量、原子、元组、列表、字符串

    这篇文章主要介绍了Erlang语法学习笔记:变量、原子、元组、列表、字符串,本文简明总结了这5种类型的相关知识,需要的朋友可以参考下
    2015-01-01
  • Erlang中执行linux命令的两种方法

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

    这篇文章主要介绍了Erlang中执行linux命令的两种方法,本文着重讲解了erlang:open_port的使用,需要的朋友可以参考下
    2015-01-01
  • CentOS 6.5源码安装Erlang教程

    CentOS 6.5源码安装Erlang教程

    这篇文章主要介绍了CentOS 6.5源码安装Erlang教程,本文讲解了源码编译安装的过程和遇到的一些错误处理方法,需要的朋友可以参考下
    2015-01-01
  • Erlang IO编程之文件目录操作常用方法小结

    Erlang IO编程之文件目录操作常用方法小结

    这篇文章主要介绍了Erlang IO编程之文件目录操作常用方法小结,本文讲解了常用的文件操作如打开文件、读取文件、写入文件、删除文件等,需要的朋友可以参考下
    2015-01-01
  • Erlang的一些编程技巧分享

    Erlang的一些编程技巧分享

    这篇文章主要介绍了Erlang的一些编程技巧分享,本文是是实际编程中的个人总结,需要的朋友可以参考下
    2015-01-01
  • Erlang中遍历取出某个位置的最大值代码

    Erlang中遍历取出某个位置的最大值代码

    这篇文章主要介绍了Erlang中遍历取出某个位置的最大值代码,本文直接给出实现代码,需要的朋友可以参考下
    2015-03-03
  • Erlang中的socket编程简单例子

    Erlang中的socket编程简单例子

    这篇文章主要介绍了Erlang中的socket编程简单例子,本文给出了TCP服务器echo示例、Tcp 的echo客户端示例、UDP server示例、UDP client 示例,需要的朋友可以参考下
    2015-03-03
  • Erlang中的模块与模式匹配介绍

    Erlang中的模块与模式匹配介绍

    这篇文章主要介绍了Erlang中的模块与模式匹配介绍,本文分别对模块与模式匹配做了讲解,需要的朋友可以参考下
    2015-03-03
  • 一篇文章带你从入门到精通:RabbitMQ

    一篇文章带你从入门到精通:RabbitMQ

    RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,所有主要的编程语言均有与代理接口通讯的客户端库
    2021-06-06
  • Erlang并发编程介绍

    Erlang并发编程介绍

    这篇文章主要介绍了Erlang并发编程介绍,本文讲解了进程的创建 、进程间通信、超时设置以及给出代码实例,需要的朋友可以参考下
    2015-01-01

最新评论