将erlang shell作为守护进程/服务运行

时间:2011-07-26 13:34:30

标签: bash erlang daemon

显然,我有一个在Erlang shell中运行的Erlang程序,我想监视它。

这就是我想要的:

  • 当机器启动时,Erlang shell应该启动它,以及在shell中运行的程序。
  • 如果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,NAME等等......这样可行,我可以这样做:

/etc/init.d/foobar start

但是,我无法阻止它...问题是我用“erl”启动Erlang shell,这是一个做一些我不理解的奇特事情的脚本。它做的一件事是,它创建了一个非常漫长而复杂的流程名称。它不仅仅是“erl”,它就像:

/usr/lib/erlang/erts-5.7.4/bin/beam.smp - -root / usr / lib / erlang -progname erl - -home / home / xxx - ....和一些更多。

有更好的方法吗?

操作系统:Ubuntu 11.04

3 个答案:

答案 0 :(得分:3)

您要做的是创建目标系统。这样做的文档在这里:http://www.erlang.org/doc/system_principles/create_target.html 但是,在你掌握基本概念之前,它起初有点复杂。

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

  1. 创建一个空节点。也就是说,'bin,erts和releases'目录(在bin中有更新的脚本)。
  2. 按照dox。
  3. 中的说明通过release_tools创建发布
  4. 在空节点上解压缩版本,将release / start_erl.data设置为指向新版本和erts版本。
  5. 然后可以将其作为具有重启/监视器的服务以及您要添加的任何内容进行管理。

答案 1 :(得分:2)

除了创建目标版本(@Martin推荐的标准Erlang生产环境)之外,还需要以下内容:

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

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

    erl -noshell -sname temp_control \
        -eval "rpc:call(mynode@myhost, init, stop, [])" \
        -s init stop
    
    • noshell禁用输入和shell输出
    • sname设置临时节点的名称
    • eval让你执行任何有效的Erlang表达式
      • rpc:call(Node, M, F, A)将在指定的节点上调用M:F(A)A是将作为真实参数传递给函数的参数列表)
    • s M F运行函数M:F()

    evals按顺序运行)

答案 2 :(得分:2)

最近发布的erld项目是真正实现Erlang应用程序守护程序的绝佳方式。它为守护进程应该做的所有事情提供支持,即:

  • 可以从init脚本启动/停止
  • 启动时,在程序成功启动(或未能成功启动)之前,控件不会返回控制台。
  • 可以将启动诊断信息打印到控制台以指示进度,但是一旦守护程序运行,输出就会停止。
  • 返回控制台时,返回码表示成功(0)或失败(其他一些号码)。
  • 可以通过发送SIGHUP
  • 来触发日志轮换

请在此处查看他们的github页面:https://github.com/ShoreTel-Inc/erld