0

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() を再度呼び出す前に、例外終了が返されます。この問題を解決するのを手伝ってください。

4

1 に答える 1

1

記憶喪失を開始するための完全に正しい方法ではないのは、アプリケーションとしてです。

application:start(mnesia).

アプリケーションを開始する前に。システムを開発するときに使用できます。実際のデプロイメントではreleaseboot-scriptを使用してを生成する必要があります。リリースは、外部マシンで起動できる自己完結型のErlangシステムです。独自のアプリケーションを作成しmy_application_name.app、への依存関係を含むファイルを作成しますmnesia。次に、リリースを生成する必要があります。通常はでreltool、このリリースは、を開始する前にmnesiaを起動することによって初期化されmy_application_nameます。少なくともこれが本当のやり方です。

のようなツールは、アプリケーションとリリースをビルドするためのファイルrebarを維持するのに役立ちます。reltool.config

Mnesiaは、開始する前にスキーマが必要であることに注意してください。一般的なトリックは、リリースにデフォルトの空のデータベースを含めることです。このデータベースは、mnesiasdirパラメーターが指すようにインストールされます。したがって、新しく生成されたシステムを起動する場合、そのシステムには開始元のデータベースがあります。また、空のデータベースを再インストールすることで、最初からやり直すことができます。FALLBACK.BUPこれを行う方法のヒントについては、mnesiaをチェックしてください。

エラーに関しては、サーバーを2回起動することはできません。初めて、それはアトムの下にそれ自体を登録するserverので、それがすでに実行されているときにその後の再起動はそれをクラッシュさせます。SASLアプリケーションを有効にしてErlangを起動すると、ヒントが得られる場合があります。application:start(sasl)次のようにerlangを実行または実行します。

erl -boot start_sasl

これは、通常のブートスクリプトを、SASLも起動するバリアントに置き換えます。

于 2012-12-29T22:28:31.197 に答える