mnesia不会与主管重启

时间:2012-12-29 15:57:26

标签: erlang supervisor

我在使用gen_server,supervisor和mnesia时遇到了问题。我有主管:http://pastebin.com/8rkfrq7D 它会启动正在启动mnesia的服务器模块。我的问题是,当我写

erl
c(superv).
superv:start_link().
//it opens fine
C^
erl
c(superv).
superv:start_link().
    ** exception exit: shutdown
//if i try again start_link() it is working
我得到了这个。我删除了负责启动mnesia的部分并且工作正常,所以我希望即时退出(通过ctrl + c)不能正确关闭mnesia。不幸的是,即使我调用mnesia:stop(),在快速再次调用start_link()之前它会返回异常退出。请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

启动mnesia的不完全正确的方法是作为一个应用程序。

application:start(mnesia).

在开始申请之前。它可以在您开发系统时使用。对于实际部署,您希望使用引导脚本生成release。发行版是一个独立的Erlang系统,您可以在外部计算机上启动。您将编写自己的应用程序,编写一个包含my_application_name.app依赖项的mnesia文件。然后,您希望生成一个版本,通常使用reltool,然后通过在启动my_application_name之前启动mnesia来初始化此版本。至少这是真正的方式。

rebar这样的工具可以帮助您维护应用程序,并可以使用reltool.config文件来构建您的版本。

请注意,Mnesia需要一个架构才能启动。一个常见的技巧是让您的版本包含一个默认的空数据库,该数据库的安装使得mnesias dir参数指向它。因此,如果您启动一个新生成的系统,它有一个数据库可以从中开始。您可以通过重新安装空数据库从头开始重新启动。查看mnesia中的FALLBACK.BUP以获取有关如何执行此操作的提示。

至于您的错误,您无法启动服务器两次。第一次,它将自己注册在原子server下,因此在它已经运行时的后续重启将使其崩溃。如果在启用SASL应用程序的情况下启动Erlang,有时可以获得提示。执行application:start(sasl)或像这样运行erlang:

erl -boot start_sasl

将正常启动脚本替换为也启动SASL的变体。