【问题标题】:Why does my Erlang boot script work from console but does not work when run from init system (sysvinit, upstart, systemd)?为什么我的 Erlang 启动脚本可以从控制台运行,但从 init 系统(sysvinit、upstart、systemd)运行时却不能运行?
【发布时间】:2016-10-04 00:59:13
【问题描述】:

我有一个 Erlang 启动脚本,我可以这样启动:

/usr/bin/erl -boot /path/to/my-boot-script

从控制台运行时它可以工作,但当我从 systemd 运行它时失败且没有任何错误消息。 systemd 单元文件如下所示:

[Unit]
Description=My daemon written in Erlang

[Service]
Type=simple
ExecStart=/usr/bin/erl -boot /path/to/my-boot-script
Restart=always

[Install]
WantedBy=multi-user.target

日志显示系统正常启动,然后突然终止,没有任何类型的错误消息。到底是怎么回事?

【问题讨论】:

    标签: linux unix erlang daemon systemd


    【解决方案1】:

    原来你必须将-noinput 参数传递给erl。否则它将尝试打开标准输入进行读取,因为那里没有任何内容而失败并终止而没有任何类型的错误消息。

    这行得通:

    [Unit]
    Description=My daemon written in Erlang
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/erl -noinput -boot /path/to/my-boot-script
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    

    【讨论】:

      【解决方案2】:

      我刚刚设法使用带有 systemd 的 erlang 安装系统来安装代码存储库。此过程符合有关设置嵌入式系统的 erlang 文档。这是我学到的:

      1) 需要在 erts/examples 中添加安装工具的路径。这是我的 .erlang 文件的摘录:

      code:add_path(filename:join([os:getenv("ROOTDIR"),"lib/sasl-2.6/examples/ebin"])).
      

      2) 按照 erlang/doc/system_principles/create_target.html 进行构建

      target_system:create("mysystem").
      

      3) 将构建提取到临时位置。对于我的应用程序,它是通过 erlang 完成的:

      target_system:install("code_repository", "/home/tony/Projects/code_repository/release_test").
      

      4) 编辑 start 的最后一行运行 erl 并删除 -daemon 选项并添加所需的任何 erlang 运行时参数,如 -sname 或 -set_cookie。这在 erlang/doc/embedded/embedded_solaris.html#idm45326372314928 中有概述。这是我系统中编辑的行:

      $ROOTDIR/bin/run_erl  /tmp/ $ROOTDIR/log "exec $ROOTDIR/bin/start_erl $ROOTDIR $RELDIR $START_ERL_DATA -sname code_repository" 
      

      5) 安装到运行时位置(不要忘记 sys.config)
      6) 如下设置 .services 文件。该文件存储在 /etc/systemd/system/code_repository.service 中:

      [Unit]
      Description=Tonys Code Repository Daemon
      
      [Service]
      Type=simple
      WorkingDirectory=/var/opt/code_repository
      Environment=HOME=/var/opt/code_repository
      ExecStart=/var/opt/code_repository/bin/start
      Restart=yes
      
      [Install]
      WantedBy=multi-user.target
      

      删除 -daemon 标志对于作为简单服务运行是必不可少的,因为简单服务会运行并且不会返回,除非它们失败。在此过程中使用 run_erl 允许 erlang 工具附加到守护程序以进行维护..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-06
        • 1970-01-01
        • 1970-01-01
        • 2017-01-01
        • 1970-01-01
        • 2012-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多