非常教程

Erlang 20参考手册

指南:嵌入式 | Guide: Embedded

嵌入式 | 1. Embedded Solaris

本节介绍与Solaris相关的OTP的操作系统特定部分。

1.1 内存使用

在带有64 MB总RAM的系统上,Solaris需要大约17 MB的RAM。这为应用程序留下了大约47 MB​​的空间。如果系统使用交换,由于不必要的守护进程被换出,这些数字无法改善。但是,如果禁用交换,或者交换空间的系统资源有限,则有必要关闭不必要的守护进程。

1.2 磁盘空间使用

通过使用核心用户支持安装,可以最小化Solaris所需的磁盘空间。它需要大约80 MB的磁盘空间。这只安装启动和运行Solaris所需的最低软件。通过删除不必要的单个文件可以进一步减少磁盘空间。但是,除非磁盘空间是关键资源,否则所需的努力和涉及的风险是不合理的。

1.3安装嵌入式系统

本节介绍如何安装嵌入式系统。考虑以下主题:

  • 创建用户和安装目录
  • 安装嵌入式系统
  • 在启动时配置自动启动
  • 提供硬件看门狗
  • 更改重新启动的权限
  • 设置TERM环境变量
  • 添加补丁
  • 在应用程序os_mon中安装模块os_sup

本节中的几个步骤需要有关Solaris操作系统的专业知识。对于他们中的大多数来说,需要超级用户权限。

创建用户和安装目录

建议嵌入式环境由普通用户运行,即没有超级用户权限的用户。

在本节中,假设用户名是,otpuser并且该用户的主目录是:

/export/home/otpuser

还假定在主目录中otpuser有一个名为的目录otp,其完整路径为:

/export/home/otpuser/otp

该目录是嵌入式环境的安装目录

安装嵌入式系统

安装嵌入式系统的过程与普通系统相同(请参阅安装指南),但以下情况除外:

  • (压缩的)磁带归档文件将在上面定义的安装目录中提取。
  • 不需要将启动脚本链接到标准目录/usr/local/bin

配置引导时的自动启动

系统启动时,必须启动真正的嵌入式系统。本节说明了实现这一点所需的必要配置。

如果将以下所示的脚本文件添加到目录中,嵌入式系统和所有应用程序将自动启动/etc/rc3.d。该文件必须是拥有且可读的root。它的名字不能任意指定; 建议使用以下名称:

S75otp.system

有关初始化(和终止)脚本及其命名的更多详细信息,请参见Solaris文档。

#!/bin/sh
#  
#  File name:  S75otp.system
#  Purpose:    Automatically starts Erlang and applications when the 
#              system starts
#  Author:     janne@erlang.ericsson.se
#  Resides in: /etc/rc3.d
#

if [ ! -d /usr/bin ]
then                    # /usr not mounted
        exit
fi

killproc() {            # kill the named process(es)
        pid=`/usr/bin/ps -e |
             /usr/bin/grep -w $1 |
             /usr/bin/sed -e 's/^  *//' -e 's/ .*//'`
        [ "$pid" != "" ] && kill $pid
}

# Start/stop processes required for Erlang

case "$1" in
'start')
        # Start the Erlang emulator
        #
        su - otpuser -c "/export/home/otpuser/otp/bin/start" &
        ;;
'stop')
        killproc beam
        ;;
*)
        echo "Usage: $0 { start | stop }"
        ;;
esac

/export/home/otpuser/otp/bin/start在上面的脚本中引用的文件恰恰是start启动Erlang中描述的脚本。该脚本OTP_ROOT中的脚本变量start对应于本节中使用的以下示例路径:

/export/home/otpuser/otp

start脚本将被相应地编辑。

killproc在上面的脚本中使用该过程可以结合调用erl_call,例如:

$SOME_PATH/erl_call -n Node init stop

要优雅地使用Erlang,请参阅erl_call(1)手册页以erl_interface获取有关使用的详细信息erl_call。但是,这要求Erlang作为分布式节点运行,但情况并非总是如此。

killproc程序不会被删除。目的在于从运行级别3(具有网络资源的多用户模式)转换到运行级别2(没有这种资源的多用户模式),其中Erlang不运行。

使硬件Watchdog可用

对于从Force计算机运行在VME板上的Solaris,只要将VME总线驱动程序添加到操作系统中,就可以激活板载硬件看门狗(另请参阅安装问题)。

另请参阅heart(3)内核中的手册页。

更改重新启动的权限

如果HEART_COMMANDstart启动Erlang中的脚本中设置环境变量,并且该值要设置为Solaris reboot命令的路径,那么:

HEART_COMMAND=/usr/sbin/reboot

那么所有权和文件权限/usr/sbin/reboot必须更改如下:

chown 0 /usr/sbin/reboot
chmod 4755 /usr/sbin/reboot

另请参阅heart(3)内核中的手册页。

设置TERM环境变量

当从S75otp.system脚本自动启动Erlang运行时系统时,TERM必须设置环境变量。以下是最低设置:

TERM=sun

这将被添加到start脚本中。

添加修补程序

为了在Solaris 2.5.1上将文件系统数据刷新到磁盘上,必须将具有编号103640-02的特定于版本的修补程序添加到操作系统中。其他补丁可能需要,请参阅发行版自述文件<ERL_INSTALL_DIR>/README

在应用程序os_mon中安装模块os_sup

以下四个安装过程需要超级用户权限:

安装
  • 制作 syslogd**:** 的Solaris标准配置文件的副本
    • 制作一份Solaris标准配置文件的副本syslogd。该文件通常syslog.conf在目录中命名并找到/etc
    • 该副本的文件名必须是syslog.conf.ORIG。目录位置是可选的; 通常是/etc。一个简单的方法是发出以下命令:cp /etc/syslog.conf /etc/syslog.conf.ORIG
  • 做一个Erlang特定的配置文件 syslogd**:**
    • 制作先前制作的备份副本的编辑副本。
    • 文件名必须是syslog.conf.OTP。该路径必须与备份副本相同。
    • 配置文件的格式可以在syslog.conf(5)手册页中找到,方法是发出命令man syslog.conf
    • 通常会添加一行来陈述:
      • Erlang将监督哪些类型的信息
      • 该文件的名称(实际上是一个命名管道),用于接收信息
 - 例如,如果只有源自UNIX内核的信息需要监控,则该行以`kern.LEVEL`开头。有关`LEVEL`的可能值,请参阅`syslog.conf(5)`。
- 在至少一个制表符后,添加的行将包含命名管道的全名,其中`syslogd`写入其信息。路径必须与文件`syslog.conf.ORIG`和`syslog.conf.OTP`相同。文件名必须是`syslog.otp`。
- 如果文件`syslog.conf.ORIG`和`syslog.conf.OTP`的目录是`/ etc`,`syslog.conf.OTP`中的行如下:kern.LEVEL / etc / syslog。 OTP
  • 检查配置文件的文件权限:
    • 配置文件具有rw-r--r--文件权限并由root拥有。
    • 一个简单的方法是发出这些命令:chmod 644 /etc/syslog.conf chmod 644 /etc/syslog.conf.ORIG chmod 644 /etc/syslog.conf.OTP
- Notice that if the files `syslog.conf.ORIG` and `syslog.conf.OTP` are not in directory `/etc`, the file path in the second and third command must be modified.
  • 修改该 实用程序的文件权限和所有权:mod_syslog
    • mod_syslog实用程序的文件权限和所有权必须修改。
    • 二进制可执行文件的全名是os_mon通过添加从文件系统中应用程序的位置派生的/priv/bin/mod_syslog。因此,二进制可执行文件的通用完整名称是:<OTP_ROOT> / lib / os_mon- <REV> / priv / bin / mod_syslog

示例:如果路径otp-root/usr/otp,那么os_mon应用程序的路径是/usr/otp/lib/os_mon-1.0(假定修订版本为1.0),二进制可执行文件的全名是/usr/otp/lib/os_mon-1.0/priv/bin/mod_syslog

 - 二进制可执行文件必须由root拥有,具有`rwsr-xr-x`文件权限,特别是用户的setuid位必须被设置。
- 一个简单的方法是发出以下命令:cd <OTP_ROOT> / lib / os_mon- <REV> / priv / bin / mod_syslog chmod 4755 mod_syslog chown root mod_syslog
测试应用程序配置文件

以下过程不需要root权限:

  • 确保应用程序中os_sup模块的配置参数os_mon是正确的。
  • 浏览应用程序配置文件(也不能编辑它)。应用程序配置文件的全名是os_mon通过添加从应用程序在文件系统中的位置派生而来的/ebin/os_mon.app。该文件的通用全名是:<OTP_ROOT>/ib/os_mon- <REV>/ebin/os_mon.app。 例如:如果路径otp-root/usr/otp,那么os_mon应用程序的路径是/usr/otp/lib/os_mon-1.0(假定版本为1.0),二进制可执行文件的全名是/usr/otp/lib/os_mon-1.0/ebin/os_mon.app
  • 确保以下配置参数具有正确的值:

参数

功能

标准值

start_os_sup

指定是否启动os_sup。

在硬件上是第一个实例; 对于其他实例为假

os_sup_own

(1)备份副本的目录和(2)syslogd的Erlang特定配置文件

“/等等”

os_sup_syslogconf

syslogd的Solaris标准配置文件的全名

“/etc/syslog.conf文件”

error_tag

在Erlang运行时系统中发送给错误记录器的消息的标记

std_error

如果中列出的值os_mon.app不符合您的需要,也不能编辑该文件。而是覆盖系统配置文件中的值,命令行中给出了其完整路径名erl

示例:应用程序配置文件的内容:

[{os_mon, [{start_os_sup, true}, {os_sup_own, "/etc"}, 
{os_sup_syslogconf, "/etc/syslog.conf"}, {os_sup_errortag, std_error}]}].
相关文件

查看os_mon(3)应用程序,application(3)内核中的erl(1)手册页以及ERTS中的手册页。

安装问题

heart端口程序控制的硬件看门狗定时器需要FORCEvme安装包含VME总线驱动程序的包。但是,该驱动程序可能会与Sun mcp驱动程序发生冲突并导致系统拒绝启动。为了解决这个问题,需要将以下几行添加到/etc/system

  • exclude: drv/mcp
  • exclude: drv/mcpzsa
  • exclude: drv/mcpp

警告

建议添加这些行以避免冲突。冲突可能导致系统无法启动。

1.4启动Erlang

本节介绍如何启动嵌入式系统。涉及四个程序,它们通常驻留在目录中<ERL_INSTALL_DIR>/bin。唯一的例外是该start程序可以位于任何地方,也是唯一必须由用户修改的程序。

在嵌入式系统中,通常不存在交互式shell。但是,操作员可以通过命令连接到Erlang系统to_erl。然后运算符连接到Erlang外壳,并可以给普通的Erlang命令。所有通过这个shell与系统的交互都被记录在一个特殊的目录中。

基本上,程序如下:

  • start机器时启动的程序被调用。
  • 它调用run_erl,它设置了操作员可以连接到系统的东西。
  • 它调用start_erl,它要求的正确版本erlexec(它位于<ERL_INSTALL_DIR>/erts-EVsn/bin)用正确的bootconfig文件。

1.5 程序

start

该程序在机器启动时调用。它可以修改或重写以适合特殊系统。默认情况下,它必须被调用start并驻留<ERL_INSTALL_DIR>/bin。通过使用start_prgSASL应用程序中的配置参数,可以使用另一个启动程序。

启动程序必须run_erl如下所示进行调用。它还必须带一个可选参数,默认为<ERL_INSTALL_DIR>/releases/start_erl.data

这个程序是设置静态参数和环境变量,比如-sname NameHEART_COMMAND重启机器。

<RELDIR>目录是安装新版本数据包的位置,以及释放处理程序保存有关发行版的信息的位置。有关更多信息,请参阅release_handler(3)SASL中的手册页。

以下脚本说明了该程序的默认行为:

#!/bin/sh
# Usage: start [DataFile]
#
ROOTDIR=/usr/local/otp

if [ -z "$RELDIR" ]
then
   RELDIR=$ROOTDIR/releases
fi

START_ERL_DATA=${1:-$RELDIR/start_erl.data}

$ROOTDIR/bin/run_erl /tmp/ $ROOTDIR/log "exec $ROOTDIR/bin/start_erl \ 
                     $ROOTDIR $RELDIR $START_ERL_DATA" > /dev/null 2>&1 &

以下脚本举例说明了一个修改,其中节点被赋予了名称cp1以及环境变量HEART_COMMANDTERM已添加到以前脚本的位置:

#!/bin/sh
# Usage: start [DataFile]
#
HEART_COMMAND=/usr/sbin/reboot
TERM=sun
export HEART_COMMAND TERM

ROOTDIR=/usr/local/otp

if [ -z "$RELDIR" ]
then
   RELDIR=$ROOTDIR/releases
fi

START_ERL_DATA=${1:-$RELDIR/start_erl.data}

$ROOTDIR/bin/run_erl /tmp/ $ROOTDIR/log "exec $ROOTDIR/bin/start_erl \ 
      $ROOTDIR $RELDIR $START_ERL_DATA -heart -sname cp1" > /dev/null 2>&1 &

如果diskless和/或只读客户机节点即将启动,则文件start_erl.data位于主节点的客户机目录中。因此,START_ERL_DATA行看起来像:

CLIENTDIR=$ROOTDIR/clients/clientname
START_ERL_DATA=${1:-$CLIENTDIR/bin/start_erl.data}

run_erl

该程序用于启动模拟器,但不会连接到外壳。to_erl用于连接到Erlang shell。

Usage: run_erl pipe_dir/ log_dir "exec command [parameters ...]"

这里:

  • pipe_dir//tmp/to_erl默认使用这个名字)。
  • log_dir 是写日志文件的地方。
  • command [parameters] 被执行。
  • 写入stdinstdout登录的所有内容log_dir

日志文件被写入log_dir。每个日志文件都有一个表单名称erlang.log.N,其中N是世代号,范围从1到5.每个日志文件最多可容纳100 kB文本。随着时间的推移,在日志文件目录中找到以下日志文​​件:

erlang.log.1
erlang.log.1, erlang.log.2
erlang.log.1, erlang.log.2, erlang.log.3
erlang.log.1, erlang.log.2, erlang.log.3, erlang.log.4
erlang.log.2, erlang.log.3, erlang.log.4, erlang.log.5
erlang.log.3, erlang.log.4, erlang.log.5, erlang.log.1
...

最近的日志文件是每行中最右边的。也就是说,最近的文件是具有最高数字的文件,或者如果已经有四个文件,则是跳过之前的文件。

当打开一个日志文件(用于追加或创建)时,时间戳将写入该文件。如果15分钟内没有写入日志文件,则会插入一条记录,表明我们还活着。

to_erl

该程序用于附加到正在运行的Erlang运行时系统,并以此开始run_erl

Usage: to_erl [pipe_name | pipe_dir]

这里pipe_name默认为/tmp/erlang.pipe.N

要在不退出 Erlang 系统的情况下从外壳断开连接,请键入Ctrl-D

start_erl

该程序通过参数-boot-config设置启动Erlang仿真器。它读取有关这些文件从一个文件名为定位的数据start_erl.data,这是位于<RELDIR>。每个新版本都引入一个新的数据文件。该文件由Erlang中的发布处理程序自动生成。

以下脚本说明了该程序的行为:

#!/bin/sh
#
# This program is called by run_erl. It starts
# the Erlang emulator and sets -boot and -config parameters.
# It should only be used at an embedded target system.
#
# Usage: start_erl RootDir RelDir DataFile [ErlFlags ...]
#
ROOTDIR=$1
shift
RELDIR=$1
shift
DataFile=$1
shift

ERTS_VSN=`awk '{print $1}' $DataFile`
VSN=`awk '{print $2}' $DataFile`

BINDIR=$ROOTDIR/erts-$ERTS_VSN/bin
EMU=beam
PROGNAME=`echo $0 | sed 's/.*\///'`
export EMU
export ROOTDIR
export BINDIR
export PROGNAME
export RELDIR

exec $BINDIR/erlexec -boot $RELDIR/$VSN/start -config $RELDIR/$VSN/sys $*

如果static_emulator设置SASL配置参数的diskless和/或只读客户机节点true即将启动,则必须更改-boot-config标志。

因为这样的客户端无法读取新start_erl.data文件(该文件不能动态更改)。引导和配置文件总是从相同的地方获取(但是如果已经安装了新版本,则需要新内容)。

release_handler这些文件复制到bin在每当一个新的版本是永久的主节点的客户端目录目录。

假设与CLIENTDIR上面相同,最后一行看起来像:

exec $BINDIR/erlexec -boot $CLIENTDIR/bin/start \ 
     -config $CLIENTDIR/bin/sys $*

指南:嵌入式 | Guide: Embedded相关

Erlang 20

Erlang 是一种通用的面向并发的编程语言,可应付大规模开发活动的程序设计语言和运行环境。

主页 https://www.erlang.org/
源码 https://github.com/erlang/otp
版本 20
发布版本 20.1