Erlang mnesia不';不要与主管重新启动

Erlang mnesia不';不要与主管重新启动,erlang,erlang-supervisor,Erlang,Erlang Supervisor,我在使用gen_服务器、主管和mnesia时遇到问题。我有一位主管: 触发正在启动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 我知道了。我删除了负责启动mn

我在使用gen_服务器、主管和mnesia时遇到问题。我有一位主管: 触发正在启动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()之前,它也会返回异常退出。请帮我解决这个问题。

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

application:start(mnesia).
在你开始申请之前。它可以在您开发系统时使用。对于真正的部署,您需要使用引导脚本生成
版本
。发行版是一个自包含的Erlang系统,您可以在外部机器上启动。您将编写自己的应用程序,编写一个
my\u application\u name.app
文件,其中包含对
mnesia
的依赖项。然后,您需要生成一个版本,通常使用
reltool
,然后在启动
my\u应用程序\u name
之前,通过启动mnesia来初始化此版本。至少这是真正的方法

类似于
rebar
的工具可以帮助您维护应用程序和用于构建版本的
reltool.config
文件

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

至于您的错误,您不能启动服务器两次。第一次,它在atom
服务器下注册自己,因此当它已经运行时,随后的重新启动将使它崩溃。如果在启用SASL应用程序的情况下启动Erlang,有时会得到提示。执行
application:start(sasl)
或像这样运行erlang:

erl -boot start_sasl

它用一个同样启动SASL的变量来替代正常启动脚本。

Thx作为答案。我添加了停止函数:[](我还提供了数据库初始化函数)。现在我可以启动_link(),然后停止,再重新启动它,它就可以工作了。但如果关闭erlang shell。再次打开它并调用start_link(),它再次返回异常exit:shutdown(显然,如果我再次调用(出错后)它就会工作)。你能帮我解决这个问题吗?是的,我能:)你的问题是你正在调用mnesia:create_schema()。这只能执行一次,下次尝试执行此操作时,它会在init函数的某个地方失败。你应该从你的mnesia:X调用中断言答案,这样你就知道哪一个失败了<例如,code>ok=mnesia:start()
。诀窍是创建一个新的空数据库,然后每次重新开始时重新安装这个数据库。看看我提到的
FALLBACK.BUP
东西,我不确定这是否正确。我写过这样的代码:case mnesia:start()of ok->ok;{error,Reason}->io:format(“基本开始:~p\n”,[Reason])%,{error,Reason}end,但不会引发错误。更重要的是,我从init中删除了create_schema/table,但它仍然失败。你能告诉我在哪里可以看到它吗?因为mnesia:create_schema在FALLBACK.BUP中生成准二进制符号。而且我还没有在文档中找到任何信息,我找到的每一个示例代码都与我的做法相同