Erlang アプリケーションをコマンドラインで起動し、その後停止する方法
どこを探しても情報が見つからなかったので、試行錯誤して以下のようにしました。
もっと良い方法があったらぜひ教えてください。
起動
behaviour application に準拠したアプリケーション(hige_app)をコマンドラインから起動するには
% erl -noshell -noinput -s hige_app start -name hige@localhost
とします。hige_app:start では application:start(hige) が呼ばれるイメージです。
アプリケーションがウェブサーバーのように常駐するプロセスの場合、起動時に -s init stop をつけるとすぐに終了してしまうので注意。
起動はバックグラウンドプロセスにしても良いでしょう。
停止
停止は起動したターミナルで Ctrl-C 。では済まない場合があります。
例えば /etc/init.d/hige stop のように stop したいときがあります。
この場合どうするかというと、「起動しているアプリケーション内で」
- application:stop を呼ぶ
- init:stop を呼ぶ
必要があります。
なので以下の hige_app:stop を用意します。
stop() -> case init:get_argument(target_node) of {ok,[[Node]]} -> ok = rpc:call(list_to_atom(Node), application, stop, [hige]), ok = rpc:call(list_to_atom(Node), init, stop, []); _ -> [] end.
そしてコマンドラインから
% erl -name dummy --- noshell \ --- noinput \ --- target_node hige@localhost \ --- s hige_app stop
とすればめでたく終了します。
補足
- hige_app:stop では init:stop の呼び出しは省略できません。省略するとアプリケーションは停止しますが、erl プロセスが残ってしまいます。
- -name オプションは -sname でも良い場合があります。
- -name を使うなら cookie あわせて使いましょう。
- アプリケーションの作り方は helloちゃんと作るシリーズ 目次 - 檜山正幸のErlang未確認情報 - はてなグループ: erlang が大変参考になります