显然,我有一个在 Erlang shell 中运行的 Erlang 程序,我想监视它。
这就是我要的:
- 当机器启动时,Erlang shell 应该随之启动,并且在 shell 中运行的程序也应该随之启动。
- 如果 Erlang shell 由于某种原因崩溃,它应该重新启动。
- 您应该能够手动启动/停止/重新启动 Erlang shell。
Example:
/etc/init.d/foobar start
/etc/init.d/foobar stop
/etc/init.d/foobar restart
我还没有开始整个“如果崩溃就重新启动”的事情,陷入了简单的事情,或者这很容易吗?
我所做的是这样的:
从 /etc/init.d/sculpture 中获取骨架代码并替换 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
除了创建目标版本(@Martin 推荐的标准 Erlang 生产环境)之外,您还需要以下内容:
为了允许自动重新启动崩溃的节点,您应该使用心脏功能 http://www.erlang.org/doc/man/heart.html.
-
要停止正在运行的 Erlang 节点,您可以启动一个临时 Erlang 节点,连接到正在运行的节点并发出停止命令:
erl -noshell -sname temp_control \
-eval "rpc:call(mynode@myhost, init, stop, [])" \
-s init stop
-
noshell
禁用输入和 shell 输出
-
sname
设置临时节点的名称
-
eval
let's you execute any valid Erlang expression
-
rpc:call(Node, M, F, A)
将会通知M:F(A)
在指定的节点上(A
是将作为实参传递给函数的参数列表)
-
s M F
运行函数M:F()
(eval
and s
按顺序运行)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)