`
litaocheng
  • 浏览: 339772 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

erlang otp 应用发布指南(一) tiny-1.0非真正OTP

阅读更多
Author: Data: Version:
litaocheng@gmail.com
2009-3-1
0.2

tiny OTP Application

为了简单,我们创建一个超级简单的application, 其只有一个module, 其不使用supervisor, 只创建一个简单的process, 我们为这个应用名叫:tinyapp (tinyapp-1.0).

其代码如下(tiny.erl):

 

-module(tiny).
-behaviour(application).

-export([start/2, stop/1]).

start(_Type, _Args) ->
   start_process().

stop(_State) ->
   ok.

start_process() ->
   FLoop =
   fun() ->
       Fun =
       fun(F) ->
           receive Msg ->
               io:format("receive msg:~p~n", [Msg]),
               F(F)
           after 1000 ->
               {ok, App} = application:get_application(self()),
               io:format(user, "~p 1.0 running...~n", [App]),
               F(F)
           end
       end,
       Fun(Fun)
   end,
   {ok, proc_lib:spawn_link(FLoop)}.

 

这个tiny.erl就是我们所有的application代码了.功能很简单就是定期打印 tiny_app running ... 信息.

请注意,这个程序并不是一个标准的Erlang OTP 应用. 因为其没有使用 supervisor , gen_server , gen_fsm , gen_event 等behavior. 在后面的部分,我们会对这个tiny app进行改造,升级.

 

然后我们定义application resource 文件(.app), tiny_app.app 文件内容如下:

 

{application, tiny_app,

   [{description, "tiny app"},

    {vsn, "1.0"},

    {modules, [tiny]},

    {registered, []},

    {applications, [kernel, stdlib, sasl]},

    {mod, {tiny, []}}

   ]

}.

 

好了,这两个文件就构成了我们的一个tiny application, 当然其内部实现可能不是很符合OTP, 但是无所谓了,我们今天的 目标是为OTP application创建installer.

 

我们的目录结构如下:

 

tiny-1.0/
    |-- ebin/
    |-- src/

 

编译tiny.erl, 将tiny.beam输出到ebin目录中, 当然有时间你可以写个Makefile, 我这里就不描述了,我们这个小应用还是很 容易编译的: $ erlc -o ../ebin tiny.erl

 

到这里,有必要看看我们的application是否可以正常运行, 进入erl shell:

 

[da66@litaocheng ~/install/tiny-1.0]$ erl -pa ./ebin
Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.6.5  (abort with ^G)
1> application:start(tiny_app).
ok
2> tiny_app version 1.0 live group leader:<0.33.0>
tiny_app version 1.0 live group leader:<0.33.0>
3> application:which_applications().
[{tiny_app,"tiny app","1.0"},
{stdlib,"ERTS  CXC 138 10","1.15.5"},
{kernel,"ERTS  CXC 138 10","2.12.5"}]
4> application:stop(tiny_app).

=INFO REPORT==== 2-Mar-2009::03:44:43 ===
   application: tiny_app
   exited: stopped
   type: temporary
ok

 

好的,一切正常, 我的application已经可以start, stop. 接下来要生成release了.

生成Release

参照 OTP Design Principles Releases 部分, 使用你喜欢的Editor定义release resource file(.rel) tiny-1.0.rel 其内容如下:

 

{release, {"tiny app release", "1.0"}, {erts, "5.6.5"},
   [{kernel, "2.12.5"},

    {stdlib, "1.15.5"},

    {sasl, "2.1.5.4"},
    {tiny_app, "1.0"}

   ]}.

 

rel文件中,指明Erlang Emulator的版本信息: erts 5.6.5(R12B-5). 我们将tiny-1.0.rel文件放在tiny-1.0目录下:

 

tiny-1.0/
    |-- ebin/
    |-- src/
    |-- tiny-1.0.rel

 

现在让我们使用sasl lib中的systools模块,根据rel文件,生成boot script和tar 运行如下:

 

[da66@litaocheng ~/install/tiny-1.0]$ erl -pa ./ebin/
Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.6.5  (abort with ^G)
1> systools:make_script("tiny-1.0").
ok
2> systools:make_tar("tiny-1.0", [{erts, "/opt/local/lib/erlang/"}]).
ok

 

查看我们的tiny-1.0目录下看多了什么东西:

 

[da6600a1@litaocheng ~/install/tiny-1.0]$ ls -p
ebin/             tiny-1.0.boot     tiny-1.0.script
src/              tiny-1.0.rel      tiny-1.0.tar.gz

 

恩,我们通过make_script生成了 tiny_app.boot和 tiny_app.script, 通过make_tar生成了tiny-1.0.tar.gz.

在生成tar时,通过指定erts选项,可以将当前的erts运行时,也会被包含到打包的文件中.这样即使被部署的机器 没有安装Erlang, 我们这个Relase包依旧可以运行.

 

此时,我们的tiny-1.0.tar.gz包含下面几个目录:

 

tiny-1.0.tar.gz --
                 |-- erts-5.6.5/
                 |-- lib/
                 |    |-- kernel-2.12.5/
                 |    |-- stdlib-1.15.5/
                 |    |-- tiny_app-1.0/
                 |-- releases/

其中make_script及make_script有很多选项,我们可以根据需要进行设定.

 

有了这个Relase, 我们怎么使用它呢? 这里就要用到sasl lib了, 我们首先把这个tiny-1.0.tar.gz copy到 $ERL_ROOT/releases 目录中, 其中$ERL_ROOT是你的erlang安装 目录,我这里是/opt/local/lib/erlang.

 

随后我们运行命令:

 

erl
1> application:start(sasl) % first start sasl
ok
2> release_handler:unpack_release("tiny-1.0").
{ok,"1.0"}

 

release_handler:unpack_release/1 的参数 Name , 对应releases目录下的 Name .tar.gz, 这里就是 tiny-1.0

通过上面的调用, tiny-1.0.tar.gz被解压,然后放置到$ERL_ROOT对应目录中:

 

$ERL_ROOT/lib 新增 tiny_app-1.0/
$ERL_ROOT/release 1.0/ 目录
$ERL_ROOT/release/RELEASES 文件被修改,添加tiny_app相关记录

恩, 这个过程其实归根结底,就是吧tiny_app-1.0放到了ERL_ROOT/lib目录,然后对ERL_ROOT/releases目录做了一些修改.

现在让我们重新启动erl, 随后, 你可以在任何目录运行tiny_app了.

  1. in erl shell > application:start(tiny_app).
  2. in linux shell $ erl -boot $ERL_ROOT/releases/1.0/start

说明:$ERL_ROOT/lib下的所有application路径都会加载到code中,所以通过第一种方式也可以方便的启动tiny_app 两种方式皆可.

 

上面解决了生成的release在本机运行的问题, 其实更多的时候,我们想将系统部署到一台"新"的机器中. 所以我们需要创建一个target system.

Target System

Target System的制作方法,请参考 Createing a First Target System . 这个target_system.erl中,根据rel文件,创建了script, boot以及tar, 也就是说,我们上一个章节的很多工作, 在这个module中都进行了处理. 我们对这个erl文件稍微进行一些改进, 加入一些传递给make_script和make_tar的参数. 改造后的文件可以从此下载: target_system.erl

 

在tiny-1.0.rel所在目录,运行target_system:create/1来创建target system:

 

[da6600a1@litaocheng ~/install/tiny-1.0]$ erl -pa ./ebin/ ../
Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.6.5  (abort with ^G)
1> target_system:create("tiny-1.0").
Reading file: "tiny-1.0.rel" ...
...省略...
Removing directory "tmp" ...
ok

 

ok 表明生成成功; 如果发生错误, 请检查你的路径信息是否正确, 以及是否拥有创建文件相关权限.

 

好了一切正常,现在tiny-1.0目录下包含下面文件:

 

[da6600a1@litaocheng ~/install/tiny-1.0]$ ls -p
ebin/             plain.script      tiny-1.0.rel
plain.boot        src/              tiny-1.0.script
plain.rel         tiny-1.0.boot     tiny-1.0.tar.gz

plain.* 系列文件启动时只加载kernel, stdlib两个lib, 没有包含我们的tiny_app,所以叫plain. 而tiny_app系列, 除却plain的项目,还包含了我们的tiny_app相关加载. 我们可以通过查看plain.script或tiny_app.script获取相关信息.

 

现在我们要安装target system了, 我们假设想安装在: /opt/local/tiny-1.0 目录.

 

这里有一个问题:如果目标机器没有安装erlang, 那么就不能使用target_system进行安装, 需要使用一段shell脚本进行安装, 主要就是解压文件, 随后替换路径从而完成安装. 这个小脚本随后会提供下载

 

执行下面命令:

 

[da6600a1@litaocheng ~/install/tiny-1.0]$ sudo erl -pa ../
Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.6.5  (abort with ^G)
1> target_system:install("tiny-1.0", "/opt/local/tiny").
Extracting tiny-1.0.tar.gz ...
Substituting in erl.src, start.src and start_erl.src to
form erl, start and start_erl ...
Creating the RELEASES file ...
ok

 

恩,好的,现在在/opt/local/tiny目录下已经安装成功.

 

接下来让我们运行这个新部署的应用:

 

[da6600a1@litaocheng ~]$ /opt/local/tiny/bin/erl -boot /opt/local/tiny/releases/1.0/start
Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.6.5  (abort with ^G)
1>  tiny_app 1.0 running...

 

不错,我们的tiny_app部署成功, 下面的部分我们要讲述更加激动人心的部分, 关于应用的热升级及回退.

分享到:
评论
6 楼 mryufeng 2009-12-04  
nuthell 写道
好!

收益非浅。

另外补充一条,可能新手会有疑问。

将作者这句

erl -pa ./ebin/

换成这个

erl -boot start_sasl -pa ./ebin

以防止,sasl没有默认加载。

提醒下 sasl无需-boot start_sasl

{release, {"tiny app release", "1.0"}, {erts, "5.6.5"},
   [{kernel, "2.12.5"},

    {stdlib, "1.15.5"},

    {sasl, "2.1.5.4"},
    {tiny_app, "1.0"}

   ]}.

因为在 启动tiny_app之前 已经先启动了sasl 2.1.5.4
5 楼 nuthell 2009-12-03  
好!

收益非浅。

另外补充一条,可能新手会有疑问。

将作者这句

erl -pa ./ebin/

换成这个

erl -boot start_sasl -pa ./ebin

以防止,sasl没有默认加载。
4 楼 mryufeng 2009-03-05  
对自动升级和降级比较搞兴趣 老大好好研究研究哦
3 楼 mryufeng 2009-03-05  
期待更精彩的系列!
2 楼 sw2wolf 2009-03-05  
以前看了下YAWS应用. 现在又复习了一下, 谢谢 !
1 楼 mryufeng 2009-03-04  
good job!

相关推荐

    AjErl:用 C# 编写的类似 Erlang 的语言解释器

    特别是关于 Erlang/OTP 和多核性能 通信顺序过程 为 JavaTM (JCSP) 通信顺序进程 如果有的话,Erlang 进程如何映射到内核线程? 在 Erlang VM 内部,专注于 SMP Creación y conexión de nodos Erlang remotos ...

    嵌入式操作系统基础.zip-综合文档

    - 分布式操作系统:多处理器或网络环境,如Erlang OTP。 - 移动操作系统:主要用于智能手机和平板电脑,如Android、iOS。 - 定制化操作系统:根据特定应用需求定制,如Linux裁剪版。 4. 嵌入式操作系统特点: -...

    SNS单模无芯光纤仿真与传感器结构特性分析——基于Rsoft beamprop模块

    内容概要:本文主要探讨了SNS单模无芯光纤的仿真分析及其在通信和传感领域的应用潜力。首先介绍了模间干涉仿真的重要性,利用Rsoft beamprop模块模拟不同模式光在光纤中的传播情况,进而分析光纤的传输性能和模式特性。接着讨论了光纤传输特性的仿真,包括损耗、色散和模式耦合等参数的评估。随后,文章分析了光纤的结构特性,如折射率分布、包层和纤芯直径对性能的影响,并探讨了镀膜技术对光纤性能的提升作用。最后,进行了变形仿真分析,研究外部因素导致的光纤变形对其性能的影响。通过这些分析,为优化光纤设计提供了理论依据。 适合人群:从事光纤通信、光学工程及相关领域的研究人员和技术人员。 使用场景及目标:适用于需要深入了解SNS单模无芯光纤特性和优化设计的研究项目,旨在提高光纤性能并拓展其应用场景。 其他说明:本文不仅提供了详细的仿真方法和技术细节,还对未来的发展方向进行了展望,强调了SNS单模无芯光纤在未来通信和传感领域的重要地位。

    发那科USM通讯程序socket-rece

    发那科USM通讯程序socket-set

    嵌入式八股文面试题库资料知识宝典-WIFI.zip

    嵌入式八股文面试题库资料知识宝典-WIFI.zip

    JS+HTML源码与image

    源码与image

    物流行业车辆路径优化:基于遗传算法和其他优化算法的MATLAB实现及应用

    内容概要:本文详细探讨了物流行业中路径规划与车辆路径优化(VRP)的问题,特别是针对冷链物流、带时间窗的车辆路径优化(VRPTW)、考虑充电桩的车辆路径优化(EVRP)以及多配送中心情况下的路径优化。文中不仅介绍了遗传算法、蚁群算法、粒子群算法等多种优化算法的理论背景,还提供了完整的MATLAB代码及注释,帮助读者理解这些算法的具体实现。此外,文章还讨论了如何通过MATLAB处理大量数据和复杂计算,以得出最优的路径方案。 适合人群:从事物流行业的研究人员和技术人员,尤其是对路径优化感兴趣的开发者和工程师。 使用场景及目标:适用于需要优化车辆路径的企业和个人,旨在提高配送效率、降低成本、确保按时交付货物。通过学习本文提供的算法和代码,读者可以在实际工作中应用这些优化方法,提升物流系统的性能。 其他说明:为了更好地理解和应用这些算法,建议读者参考相关文献和教程进行深入学习。同时,实际应用中还需根据具体情况进行参数调整和优化。

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_8.doc.zip

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_8.doc.zip

    基于灰狼优化算法的城市路径规划Matlab实现——解决TSP问题

    内容概要:本文介绍了基于灰狼优化算法(GWO)的城市路径规划优化问题(TSP),并通过Matlab实现了该算法。文章详细解释了GWO算法的工作原理,包括寻找猎物、围捕猎物和攻击猎物三个阶段,并提供了具体的代码示例。通过不断迭代优化路径,最终得到最优的城市路径规划方案。与传统TSP求解方法相比,GWO算法具有更好的全局搜索能力和较快的收敛速度,适用于复杂的城市环境。尽管如此,算法在面对大量城市节点时仍面临运算时间和参数设置的挑战。 适合人群:对路径规划、优化算法感兴趣的科研人员、学生以及从事交通规划的专业人士。 使用场景及目标:①研究和开发高效的路径规划算法;②优化城市交通系统,提升出行效率;③探索人工智能在交通领域的应用。 其他说明:文中提到的代码可以作为学习和研究的基础,但实际应用中需要根据具体情况调整算法参数和优化策略。

    嵌入式八股文面试题库资料知识宝典-Intel3.zip

    嵌入式八股文面试题库资料知识宝典-Intel3.zip

    嵌入式八股文面试题库资料知识宝典-2019京东C++.zip

    嵌入式八股文面试题库资料知识宝典-2019京东C++.zip

    嵌入式八股文面试题库资料知识宝典-北京光桥科技有限公司面试题.zip

    嵌入式八股文面试题库资料知识宝典-北京光桥科技有限公司面试题.zip

    物理学领域十字形声子晶体的能带与传输特性研究及应用

    内容概要:本文详细探讨了十字形声子晶体的能带结构和传输特性。首先介绍了声子晶体作为新型周期性结构在物理学和工程学中的重要地位,特别是十字形声子晶体的独特结构特点。接着从散射体的形状、大小、排列周期等方面分析了其对能带结构的影响,并通过理论计算和仿真获得了能带图。随后讨论了十字形声子晶体的传输特性,即它对声波的调控能力,包括传播速度、模式和能量分布的变化。最后通过大量实验和仿真验证了理论分析的正确性,并得出结论指出散射体的材料、形状和排列方式对其性能有重大影响。 适合人群:从事物理学、材料科学、声学等相关领域的研究人员和技术人员。 使用场景及目标:适用于希望深入了解声子晶体尤其是十字形声子晶体能带与传输特性的科研工作者,旨在为相关领域的创新和发展提供理论支持和技术指导。 其他说明:文中还对未来的研究方向进行了展望,强调了声子晶体在未来多个领域的潜在应用价值。

    嵌入式系统开发_USB主机控制器_Arduino兼容开源硬件_基于Mega32U4和MAX3421E芯片的USB设备扩展开发板_支持多种USB外设接入与控制的通用型嵌入式开发平台_.zip

    嵌入式系统开发_USB主机控制器_Arduino兼容开源硬件_基于Mega32U4和MAX3421E芯片的USB设备扩展开发板_支持多种USB外设接入与控制的通用型嵌入式开发平台_

    e2b8a-main.zip

    e2b8a-main.zip

    少儿编程scratch项目源代码文件案例素材-火柴人跑酷(2).zip

    少儿编程scratch项目源代码文件案例素材-火柴人跑酷(2).zip

    【HarmonyOS分布式技术】远程启动子系统详解:跨设备无缝启动与智能协同的应用场景及未来展望

    内容概要:本文详细介绍了HarmonyOS分布式远程启动子系统,该系统作为HarmonyOS的重要组成部分,旨在打破设备间的界限,实现跨设备无缝启动、智能设备选择和数据同步与连续性等功能。通过分布式软总线和分布式数据管理技术,它能够快速、稳定地实现设备间的通信和数据同步,为用户提供便捷的操作体验。文章还探讨了该系统在智能家居、智能办公和教育等领域的应用场景,展示了其在提升效率和用户体验方面的巨大潜力。最后,文章展望了该系统的未来发展,强调其在技术优化和应用场景拓展上的无限可能性。 适合人群:对HarmonyOS及其分布式技术感兴趣的用户、开发者和行业从业者。 使用场景及目标:①理解HarmonyOS分布式远程启动子系统的工作原理和技术细节;②探索该系统在智能家居、智能办公和教育等领域的具体应用场景;③了解该系统为开发者提供的开发优势和实践要点。 其他说明:本文不仅介绍了HarmonyOS分布式远程启动子系统的核心技术和应用场景,还展望了其未来的发展方向。通过阅读本文,用户可以全面了解该系统如何通过技术创新提升设备间的协同能力和用户体验,为智能生活带来新的变革。

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_1.zip

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_1.zip

    少儿编程scratch项目源代码文件案例素材-激光反弹.zip

    少儿编程scratch项目源代码文件案例素材-激光反弹.zip

    COMSOL相控阵检测技术在有机玻璃斜楔中检测工件内部缺陷的应用研究

    内容概要:本文详细介绍了COMSOL相控阵检测技术在有机玻璃斜楔上放置16阵元进行工件内部缺陷检测的方法。首先阐述了相控阵检测技术的基本原理,特别是通过控制各阵元的激发时间和相位来实现声波的聚焦和扫描。接着,重点解析了横孔缺陷的反射接收波,解释了波的折射现象及其背后的物理原因。最后,通过实例展示了COMSOL模拟声波传播过程的成功应用,验证了该技术的有效性和准确性。 适合人群:从事固体力学、无损检测领域的研究人员和技术人员,尤其是对相控阵检测技术和COMSOL仿真感兴趣的读者。 使用场景及目标:适用于需要精确检测工件内部缺陷的研究和工业应用场景,旨在提高检测精度和效率,确保产品质量和安全。 其他说明:文中提到的声速匹配现象有助于理解波在不同介质间的传播特性,这对优化检测参数设置有重要意义。

Global site tag (gtag.js) - Google Analytics