【问题标题】:Erlang start application in productionErlang 在生产环境中启动应用程序
【发布时间】:2011-10-25 08:23:19
【问题描述】:

当我在 localhost 上测试我的 erlang 应用程序时,我有一个启动服务器的脚本,如下所示:

#!/bin/sh
PWD="$(pwd)"
NAME="$(basename $PWD)"
erl -pa "$PWD/ebin" deps/*/ebin -boot start_sasl \
    -name devnode@127.0.0.1 \
    -s reloader \
    -s $NAME \
    -setcookie some_random_cookie \
    +K true \
    +P 65536 

这会提示打开 Erlang shell,然后我会输入如下内容:

application:start(myapp)

这对于开发目的来说很好,但是我如何在生产中部署它呢?截至目前,我能想到的唯一方法是启动屏幕进程并从中分离。我不认为应该是这样。我正在使用钢筋,如果这有帮助的话。

【问题讨论】:

    标签: erlang rebar


    【解决方案1】:

    听起来您想使用自定义启动脚本。引导脚本告诉 erlang 系统要启动什么。在您使用的脚本中,您正在设置引导脚本:

    -boot start_sasl
    

    http://www.erlang.org/doc/system_principles/system_principles.html,查找“用户定义的启动脚本”部分

    一个更简单的选择可能是将您的应用程序转换为使用钢筋:https://github.com/basho/rebar。然后,您将能够执行以下操作:

    ./rebar compile generate
    

    这将为应用程序创建一个版本,然后您可以:

    ./rel/<app_name>/bin/<app_name>
    

    相同的原则,只是为了方便使用而封装起来。

    【讨论】:

    • 请注意,他已经提到正在使用钢筋。如果您解释了如何编写 rebar reltool.config,您的答案会好很多。
    【解决方案2】:

    添加参数-detacheddocumentation 很好地总结了这一点:

    启动与系统控制台分离的 Erlang 运行时系统。对于运行守护进程和后台进程很有用。

    一旦你这样做了,你就可以让你的应用程序以-s 参数启动。假设$NAME = myapp,init 将尝试调用myapp:start/0(如果需要,可以自定义)。该函数应以调用 application:start(myapp) 结束。

    如果你能把所有这些拼图都弄好,你应该有一个工作脚本。

    【讨论】:

      【解决方案3】:

      好吧,您可以尝试将其连接到 Apache (see here),或者使用nohup 的一个不像屏幕会话那么简单的简单解决方案。如果您实际上是在生产服务器上实现此功能,并且不想采用 Apache 路线,您可以考虑使用init script

      【讨论】:

      • Apache 和这里​​有什么关系?我的 Erlang 节点不运行 Web 服务器。
      • 啊,根据您提供给脚本的信息,我认为它的行为类似于网络服务器,但我猜它也可能只是与另一个网络服务器交互。在这种情况下,apache 的帮助会降低;)nohup 仍然是一个很好的解决方案,尽管使用 -detached 选项可能会更好。
      • -1。一个令人困惑的答案。 Apache与它无关,nohup对于分离的erlang节点不是必需的。
      猜你喜欢
      • 2013-03-06
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 2013-07-28
      • 1970-01-01
      • 2010-10-03
      相关资源
      最近更新 更多