【问题标题】:Erlang escript launching application with start parametersErlang escript 使用启动参数启动应用程序
【发布时间】:2015-04-07 20:01:06
【问题描述】:

目前我的 Erlang 应用程序是在一个 escript(TCP 服务器)中启动的,并且一切正常,因为它使用我提供的默认端口。现在我想通过 escript 将端口传递给应用程序,但我不知道如何。 (该应用运行一个主管

script.escript

!/usr/bin/env escript
%% -*- erlang -*-

-export([main/1]).

main([UDPort, TCPort]) ->
   U = list_to_integer(UDPort),
   T = list_to_integer(TCPort),

    app:start(), %% Want to pass T into the startup.
  receive
    _ -> ok
  end;

...

app.erl

-module(app).
-behaviour(application).

-export([start/0, start/2, stop/0, stop/1]).

-define(PORT, 4300).

start () -> application:start(?MODULE). %% This is called by the escript.
stop () -> application:stop(?MODULE).

start (_StartType, _StartArgs) -> supervisor:start(?PORT).
stop (_State) -> ok.

老实说,我不确定使用应用程序是否可以做到这一点,但我认为最好问一下。

【问题讨论】:

    标签: erlang escript


    【解决方案1】:

    常见的方法是从刚刚调用的任何 shell 开始

    erl -run foo
    

    但你也可以这样做

    erl -appname key value
    

    设置环境值,然后

    application:get_env(appname, key)
    

    获得您正在寻找的价值。

    也就是说……

    我喜欢让服务应用程序成为无需关闭即可(重新)配置的东西。我通常会包含一些消息协议,例如{config, Aspect, Setting} 或类似的可以动态改变服务的基本状态的协议。因为我经常这样做,所以我通常只是让启动应用程序的任何脚本也向它发送配置消息。

    因此,考虑到这一点,考虑这个粗略的概念示例:

    !/usr/bin/env escript
    %% -*- erlang -*-
    
    -export([main/1]).
    
    main([UDPort, TCPort]) ->
        U = list_to_integer(UDPort),
        T = list_to_integer(TCPort),
        ok = case whereis(app) of
            undefined ->  app:start();
            _Pid      ->  ok
        end,
        ok = set_ports(U, T).
    
    %% Just an illustration.
    %% Making this a synchronous gen_server/gen_fsm call is way better.
    set_ports(U, T) ->
        app ! {config, listen, {tcp, T}},
        app ! {config, listen, {udp, U}},
        ok.
    

    现在启动脚本不仅是启动脚本,还是配置脚本。关键不是要有启动脚本,而是要在您指定的端口上运行服务。当然,这并不是适用于所有工具的概念,但它应该给你一些想法。还有一种做法是将配置文件放在应用程序知道要查看的位置并从中读取术语,以及其他技术(例如在应用程序规范中包括端口等)。

    编辑

    我刚刚意识到您是在一个 escript 中执行此操作的,每次调用它时都会生成一个新节点。为了使上述技术正常工作,您需要将 escript 名称设置为服务运行的节点,并在它已经存在时定位它。

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 2016-11-30
      • 1970-01-01
      • 2013-02-13
      • 2011-03-04
      • 2012-10-11
      • 1970-01-01
      • 2016-06-11
      • 2019-03-07
      相关资源
      最近更新 更多