【发布时间】:2011-02-24 17:13:53
【问题描述】:
我有以下脚本:
#!/usr/bin/env escript
%%! -name test_starter@127.0.0.1
main(_) ->
NodeName = test,
Host = '127.0.0.1',
Args = "",
{ok, _Node} = slave:start_link(Host, NodeName, Args),
io:format("Node started successfully!").
在 Ubuntu 10.04 上运行它时,我得到了这个:
$ ./start_slave
Node started successfully!
$
我想安装我自己的 Erlang(最新版本,调试透析器的编译文件等),因为在 Ubuntu 上安装的 Erlang 缺少一些功能。我将我的 Erlang 二进制文件放在 ~/Applications/bin 中。启动 Erlang 正常工作,在 Erlang shell 中启动从节点也可以工作。
但是,现在我的 escript 不起作用。大约 60 秒后它返回一个错误:
$ ./start_slave
escript: exception error: no match of right hand side value {error,timeout}
即使我将第一行更改为 escript 以使用我的 erlang 版本,它仍然不起作用:
#!/home/user/Applications/bin/escript
从节点开始时调用erlang:open_port/2,它似乎正在使用sh,而sh 又不读取设置我的自定义PATH 环境变量的.bashrc 文件。当slave:start_link/3 等待从节点响应时似乎会发生超时,但它从来没有这样做过。
如何在 Ubuntu 10.4 上自行安装 Erlang 并在 escripts 中启动从节点?
更新:我尝试在/etc/environment 中添加自定义Erlang 的路径(在Ubuntu 中设置了原始PATH),但这并没有改变任何东西...
更新 2: 接受给出的唯一答案(即使它没有解决问题)。 Ubuntu 和 Erlang 版本现在有点老了,这可能不再是问题了。
【问题讨论】:
-
您确定要使用
start_link而不是start吗?这样,当您的脚本自行终止时(在调用 main 之后出现),您的从属服务器会自动退出。请参阅start_link的文档。 -
重点是在`start_link/3返回'之前节点启动就超时了。
-
另外,关键是运行测试,所以当脚本死亡时节点死亡我可以接受。 :-)