【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.

参考文档:

http://erlang.org/doc/man/os.html#cmd-1

http://erlang.org/doc/man/erlang.html#open_port-2

时间: 2024-08-05 12:42:05

【erlang】执行linux命令的两种方法的相关文章

MySQL命令执行sql文件的两种方法

MySQL命令执行sql文件的两种方法 摘要:和其他数据库一样,MySQL也提供了命令执行sql脚本文件,方便地进行数据库.表以及数据等各种操作.下面笔者讲解MySQL执行sql文件命令的两种方法,希望能给刚开始学习 MySQL 数据库的朋友们. 学习过 SQLServer 或 Oracle 的朋友会知道,sql 脚本是包含一到多个 sql 命令的 sql 语句集合,我们可以将这些 sql 脚本放在一个文本文件中(我们称之为“sql 脚本文件”),然后通过相关的命令执行这个 sql 脚本文件.基

一、查看Linux内核版本命令(两种方法):

一.查看Linux内核版本命令(两种方法): 1.cat /proc/version [[email protected]CentOS home]# cat /proc/versionLinux version 2.6.32-431.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013 2.uname -a [

自学Linux命令的四种方法

自学Linux命令的四种方法 导读 童鞋们刚接触linux时,在学习过程中中会遇到不少问题,学习linux摸不着头脑,那么下面介绍四种linux的学习方法,特别适合新手. 方法一:终端"每日提示" 在.bashrc中(/home/.bashrc)增加如下一行: echo "Did you know that:"; whatis$(ls /bin | shuf -n 1) 你只需要增加这行就够了!如果你想让它更娱乐化一些,你可以安装cowsay.Ubuntu/Debi

在 Ruby 中执行 Shell 命令的 6 种方法

我们时常会与操作系统交互或在 Ruby 中执行 Shell 命令.Ruby为我们提供了完成该任务的诸多方法. Exec Kernel#exec 通过执行给定的命令来替换当前进程,例如: $ irb >> exec 'echo "hello $HOSTNAME"' hello codefun $ 注意 exec 利用 echo 命令替换了 irb 进程,然后退出.因为 Ruby 实际上结束了该方法,所以只能有限使用.该方法的缺点是,你无法从 Ruby 脚本中知道命令是执行成功

更改Linux时区的两种方法

在Azure上的Linux虚拟机启动后默认是UTC的时区.对很多应用要记录时间戳非常的不方便. 本文将介绍两种更改Linux时间戳的方法,供大家参考. 1.修改/etc/localtime文件 控制系统时区的文件是/etc/localtime.只要把这个文件复制成相应时区的文件,系统时区就改成相应的时间了. 时区信息在:/usr/share/zoneinfo里.比如需要把本机 时区改成Shanghai的时间: cp /usr/share/zoneinfo/Asia/Shanghai /etc/l

windows远程执行cmd命令的9种方法

一.远程执行命令方式及对应端口: ? IPC$+AT 445 ? PSEXEC 445 ? WMI 135 ? Winrm 5985(HTTP)&5986(HTTPS) 二.9种远程执行cmd命令的方法: 1.WMI执行命令方式,无回显: wmic /node:192.168.1.158 /user:pt007 /password:admin123 process call create "cmd.exe /c ipconfig>d:\result.txt" 2.使用Ha

Python执行Linux系统命令的4种方法

(1) os.system 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 代码如下: system(command) -> exit_status Execute the command (a string) in a subshell. 如果在命令行下执行,结果直接打印出来 代码如下: >>>  os.system('ls') 04101419778.CHM   bash      document    media      py-django   video

Python执行Linux系统命令的四种方法

(1) os.system 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 system(command) -> exit_status Execute the command (a string) in a subshell. 如果再命令行下执行,结果直接打印出来 >>> os.system('ls') 04101419778.CHM   bash      document    media      py-django   video 11.wmv       

shell 自动交互式处理命令的两种方法实践

1:use echo -e example: echo -e "n\np\n1\n\n+100M\nn\np\n2\n\n+1024M\nw\n"|fdisk /dev/vdb \n代表回车 [[email protected] ~]# fdisk -l /dev/vdb Disk /dev/vdb: 8589 MB, 8589934592 bytes16 heads, 63 sectors/track, 16644 cylindersUnits = cylinders of 1008