【发布时间】:2011-07-13 06:17:18
【问题描述】:
我有 erlang 应用程序:*.app 文件和一些 *.erl 文件。我全部编译。在终端中,我启动 erl 并出现 application:start(my_application).,一切正常,但如果我关闭终端应用程序也关闭。如何在没有终端的情况下运行应用程序?
谢谢。
【问题讨论】:
我有 erlang 应用程序:*.app 文件和一些 *.erl 文件。我全部编译。在终端中,我启动 erl 并出现 application:start(my_application).,一切正常,但如果我关闭终端应用程序也关闭。如何在没有终端的情况下运行应用程序?
谢谢。
【问题讨论】:
处理这种情况的正确方法是构建一个包含您的应用程序的版本并运行所谓的嵌入式系统。 此版本将完全独立(它将包含 erts 和所有库,如内核、std、mnesia 等)。 启动时,新进程不会连接到 shell 进程。 它将是操作系统进程,因此您可以使用管道附加到它。所有脚本都包含在 OTP 中。 这是一些信息:http://www.erlang.org/doc/design_principles/release_structure.html 它可能看起来很复杂,但钢筋等工具可以为您完成一切。
【讨论】:
您可能希望将-noshell 选项用于erl。语法是
erl -noshell -s Module Function Arguments
所以在你的情况下,这可能是
erl -noshell -s application start my_application
这应该允许您(例如,如果您在 Unix/Linux 上)将您的应用程序作为后台进程启动并保持运行。
一个有用的变体是同时调用init 模块的stop/0 函数,这样Erlang 环境将在运行完你的函数后停止。如果您想运行一个简单的一次性函数并将输出通过管道传输到其他进程,这会派上用场。
因此,例如,您可以通过管道传送到 more
erl -noshell -s mymodule myfunction -s init stop | more
最后,如果适合您的情况,您还可以使用escript 命令将您的 Erlang 代码作为脚本而不是编译代码运行。
希望对您有所帮助。
【讨论】: