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

red*_*uht 5 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
Run Code Online (Sandbox Code Playgroud)

我还没有从整个“崩溃时自动重启”的事情开始,被简单的事情卡住了,还是很容易?

我所做的是这样的:

从 /etc/init.d/skeleton 中获取骨架代码并替换了 PATH、DESC、NAME 等...这有效,我可以这样做:

/etc/init.d/foobar start
Run Code Online (Sandbox Code Playgroud)

但是,我无法阻止它......问题是我用“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

Ada*_*erg 3

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

  • 为了允许自动重新启动崩溃的节点,您应该使用heart 功能

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

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

    eval并按s顺序运行)