2011-07-26 56 views
4

我有一个在Erlang shell中运行的Erlang程序,很明显,我想监视它。运行erlang shell作为守护进程/服务

这就是我想要的:

  • 当机器开始Erlang的外壳应该启动它,并且在外壳上运行过该程序。
  • 如果Erlang shell由于某种原因崩溃,它应该重新启动。
  • 您应该能够手动启动/停止/重新启动Erlang shell。

例子:

/etc/init.d/foobar start 
/etc/init.d/foobar stop 
/etc/init.d/foobar restart 

我还没有开始与整个“重新启动本身,如果崩溃”的东西还在,卡住了与容易的事情,或者是容易吗?

取自/etc/init.d/skeleton骨架代码,并取代了PATH,DESC,名称等等...这工作,我可以这样做::

我做了什么,这是

/etc/init.d/foobar start 

但是,我不能阻止它......的事情是,我开始Erlang的外壳采用“ERL”,这是一个脚本,不,我不明白了一些花哨的东西。它所做的一件事就是创建一个非常漫长而复杂的流程名称。这不仅仅是“erl”:

/usr/lib/erlang/erts-5.7.4/bin/beam.smp - -root/usr/lib/erlang -progname erl - -home/home/xxx - ....等等。

有没有更好的方式来做到这一点?

操作系统:Ubuntu的11.04

+0

你看到螺纹钢? https://bitbucket.org/basho/rebar/wiki/Home – W55tKQbuRu28Q4xv

回答

2

除了创建一个目标发布,标准的Erlang生产环境的建议@马丁,你需要以下条件:

  • 要允许崩溃节点的自动重启,你应该使用the heart functionality

  • 要停止正在运行的Erlang节点,你可以开始了一个临时的Erlang节点,连接到正在运行的节点,并发出停止命令:

    erl -noshell -sname temp_control \ 
        -eval "rpc:call([email protected], init, stop, [])" \ 
        -s init stop 
    
    • noshell禁止输入和外壳输出
    • sname设置临时节点的名称
    • eval让我们来执行任何有效的Erlang表达式
      • rpc:call(Node, M, F, A)将调用M:F(A)指定的节点上(A是参数列表将被传递给函数的实际参数)
    • s M F运行功能M:F()

    evals正在运行按顺序)

+0

当我这样做,我得到:从不允许节点temp_control **连接尝试@ubuntu ** 我还没有想出如何创建目标系统尚未虽然...我不二郎不够好理解它:( –

+0

NVM我解决了,他们需要用相同的cookie开始:) –

+0

是的,创建目标系统是非常困难和复杂的。请查看Martin的回答(附带我的评论),了解关于该主题的一些基本引文。 –

3

你想要做的是创建一个目标系统。这样做的文档在这里:http://www.erlang.org/doc/system_principles/create_target.html 但是,起初有点复杂,直到你了解基本概念。

粗略地说,你执行以下操作:

  1. 创建一个空的节点。也就是'bin,erts和release'目录(在bin中有更新的脚本)。
  2. 按照dox中的描述通过release_tools创建发布。
  3. 在空节点上解压缩发行版,将release/start_erl.data设置为指向新版本和erts版本。

然后,这可以作为服务与重新启动/监视器和任何你想添加管理。

+1

更多的好资源:如何创建一个Erlang第一目标系统(http://streamhacker.com/2009/07/02/how-to-create -an-二郎先目标系统/)和[二郎/ OTP释放:钢筋,release_handler,.appup等](http://www.metabrew.com/article/erlangotp-releases-rebar-release_handler-appup -etc) –

+0

这些天来,我会考虑使用RELX - 它简化成为一个伟大的交易:https://github.com/erlware/relx –

2

最近发布的erld项目是一个真正的d通过Erlang应用程序。它提供了所有的东西守护进程应该做的,即支持:

  • 可以开始从一个init脚本
  • 在启动时,直到程序已成功启动控制不会返回到控制台/停止(或失败这样做)。
  • 启动诊断信息可以被打印到控制台,以指示进展,但输出停止一旦守护程序正在运行。
  • 返回到控制台时,返回码指示成功(0)或失败(某些其他号码)。
  • 日志旋转可以通过发送SIGHUP触发

在这里看到自己的github页:https://github.com/ShoreTel-Inc/erld