非常教程

Erlang 20参考手册

ERTS

erlsrv

命令

erlsrv

命令摘要

在Windows上作为服务运行Erlang模拟器

描述

此实用程序特定于Windows NT / 2000 / XP(及更高版本的Windows)。它允许Erlang仿真器在Windows系统上作为服务运行,允许嵌入式系统在没有任何用户需要登录的情况下启动。以这种方式启动的仿真器可以通过Windows服务小程序以与其他服务类似的方式进行操作。

注意erlsrv不是Windows的通用服务实用程序,而是为嵌入式Erlang系统设计的。

erlsrv还提供了一个命令行接口,用于注册、更改、启动和停止服务.

为了操纵服务,登录用户必须拥有该计算机的管理员权限。Erlang机器本身(默认)以本地管理员身份运行。这可以通过Windows中的服务小程序进行更改。

与普通服务相比,服务创建的进程可以与任务管理器“终止”。杀死由服务启动的模拟器会触发为该服务指定的“OnFail”操作,该操作可以是重新启动。

可以为每个Erlang服务指定以下参数:

StopAction

告诉erlsrv如何停止Erlang模拟器。默认是杀死它(Win32 TerminateProcess),但是这个动作可以指定任何将在模拟器中执行的Erlang shell命令,以使其停止。命令在shell中发出后,模拟器应在30秒内停止。如果仿真器没有停止,它会向服务管理器报告运行状态。

OnFail

可以是下列之一:

reboot

每当模拟器停止时,Windows系统都会重新启动(一种更简单的看门狗形式)。这对于不那么重要的系统可能是有用的,否则使用心脏功能来实现这一点。

restart

当Erlang仿真器停止时,重新启动Erlang仿真器(无论在什么时候为服务注册任何参数)。如果仿真程序在10秒内再次停止,它将不会重新启动以避免无限循环,这可能会挂起Windows系统。

restart_always

类似于restart,但不尝试检测循环重新启动;预计会出现其他机制来避免问题。

ignore (默认)

在服务管理器失败时,将停止时的服务报告给服务管理器;必须手动重新启动它。

在使用发布处理的系统上,这总是要设置为ignoreheart改为使用重新启动失败时的服务。

Machine

Erlang模拟器的位置。默认erl.exe位置与目录位于同一目录中erlsrv.exe。不要指定werl.exe为这个模拟器,它不会工作。

如果系统使用发布处理,则将其设置为类似于start_erl.exe...

Env

指定模拟器的额外环境。此处指定的环境变量将添加到服务启动时通常存在的系统范围环境块中。在系统范围环境和服务环境规范中出现的变量将被设置为服务中指定的值。

WorkDir

Erlang仿真器的工作目录。必须位于本地驱动器上(服务启动时不安装网络驱动器)。服务的默认工作目录是%SystemDrive%%SystemPath%。调试日志文件将被放置在这个目录中。

Priority

模拟器的进程优先级。可以是下列之一:

realtime

不推荐,因为机器可能无法访问交互式用户。

high

如果两个Erlang节点驻留在一个专用系统上,而另一个节点具有优先级,则可以使用。

low

如果仿真程序进程不影响交互性能,则可以使用。

default (默认> **SName or Name **

指定Erlang仿真器的短或长节点名称。Erlang服务总是分布式的。默认是使用服务名称作为(简称)节点名称。

DebugType

指定来自Erlang外壳的输出将被发送到“调试日志”。 该日志文件被命名为<servicename> .debug或<servicename> .debug。<N>,其中<N>是一个从1到99的整数。日志文件放置在服务的工作目录中(如WorkDir中指定的)。

可以是下列之一:

new

每次调用服务时都使用单独的日志文件(<servicename> .debug.<N>)。

reuse

重用相同的日志文件(<servicename> .debug)。

console

打开服务的Erlang外壳的交互式Windows控制台窗口。自动禁用StopAction。使用交互式控制台窗口启动的服务无法在注销后生存。OnFail操作也不适用于调试控制台。

none (默认)

Erlang shell的输出被丢弃。

console选项不适用于生产。这只是在开发过程中调试Erlang服务的一种便捷方式。

newreuse选项似乎在生产系统中方便,但考虑到该日志的系统生命周期内无限增长,不能被截断,除非重新启动该服务。

简而言之,DebugType仅用于调试。使用标准的Erlang日志记录工具可以更好地生产日志。

Args

将额外参数传递给模拟器启动程序erl.exe(或start_erl.exe)。 无法在此处指定的参数是-noinput(StopActions不起作用),-name和-sname(它们以任何方式指定)。 最常见的用途是指定将cookie和标志传递给init:boot()(-s)。

InternalServiceName

指定Windows内部的服务名称(不是显示名称,erlsrv用于标识服务的名称)。

该内部名称无法更改,即使重命名该服务也是固定的。erlsrv创建服务时生成唯一的内部名称。如果要为应用程序使用发布处理,则建议保持默认状态。

如果查看PropertiesErlang服务,可以在Windows服务管理器中看到内部服务名称。

Comment

描述服务的文字评论。不是强制性的,但显示为Windows服务管理器中的服务描述。

在使用版本处理的系统中,服务的命名必须遵循约定NodeName _ Release,其中NodeName是Erlang节点名称的第一部分(最多但不包括“@”),Release是当前版本应用程序。

输出

erlsrv {set | add} <service-name> [<service options>]

setadd分别的命令修改或添加一个Erlang服务。add在这种情况下,所有默认值(如上所述)都适用,命令的最简单形式没有任何选项。服务名称是强制性的。

每个选项都可以不带参数指定,然后应用默认值。只有在不使用默认值时才会提供选项值。例如,erlsrv set myservice -prio -arg设置默认优先级并删除所有参数。

服务选择:

-st[opaction] [<erlang shell command>]

定义StopAction,当服务停止时给Erlangshell的命令。默认为无。

-on[fail] [{reboot | restart | restart_always}]

当Erlang模拟器意外停止时要采取的操作。默认是忽略。

-m[achine] [<erl-command>]

Erlang仿真器的完整路径。切勿werl为此使用该程序。默认为与erl.exe。相同的目录erlsrv.exe。当使用发布处理时,这将被设置为类似于的程序start_erl.exe

-e[nv] [<variable>[=<value>]] ...

编辑服务的环境块。指定的每个环境变量都被添加到系统环境块中。如果此处指定的变量与系统范围的环境变量具有相同的名称,则指定的值将覆盖系统范围。通过指定<variable> = <value>将环境变量添加到此列表中,并通过单独指定<variable>从列表中删除。环境块会自动排序。任何数量的-env选项都可以在一个命令中指定。缺省情况是使用未修改的系统环境块(除了两个补充,请参见Environment下面的部分)。

-w[orkdir] [<directory>]

Erlang模拟器的初始工作目录。默认为系统目录。

-p[riority] [{low|high|realtime}]

Erlang模拟器的优先级。默认为Windows默认优先级。

{-sn[ame] | -n[ame]} [<node-name>]

Erlang机器的节点名。分配是强制性的。默认为-sname <service name>...

-d[ebugtype] [{new|reuse|console}]

指定要在何处发送shell输出。默认情况下,shell输出将被丢弃。仅用于调试。

-ar[gs] [<limited erl arguments>]

额外的Erlang模拟器参数。 避免-noinput,-noshell和-sname / -name。 默认是没有额外的参数。 请记住,服务cookie文件不一定与交互式用户相同。 该服务以本地管理员身份运行。 在一个字符串中指定所有参数,使用双引号(“)指定包含空格的参数字符串,并在必要时使用引号引号(\”)在参数字符串中指定引号。

-i[nternalservicename] [<internal name>]

只允许添加。 指定服务的Windows内部服务名称,默认情况下,在添加新服务时,通过erlsrv将其设置为唯一(以原始服务名称作为前缀)。 指定这是纯粹的cosmethic动作,如果要执行发布处理,则不推荐使用。 创建服务后,内部服务名称不能更改。 内部名称不能与普通服务名称混淆,该名称是用于标识erlsrv服务的名称。

-c[omment] [<short description>]

指定描述服务的文本注释。此评论显示为Windows服务管理器中的服务描述。

erlsrv {start | start_disabled | stop | disable | enable} <service-name>

这些命令只是为了方便而添加的,操纵服务状态的正常方式是通过控制面板服务小程序。

startstop命令与用于启动和停止服务的服务管理器通信。这些命令一直等到服务启动或停止。禁用服务时,不停止,禁用状态在服务停止前不生效。启用服务会将其设置为在启动时启动的自动模式。该命令不能将服务设置为手动。

无论启用/禁用还是启动/停止,start_disabled命令都会对服务进行操作。 它通过首先启用它(不管是否启用),然后启动它(如果尚未启动),然后禁用它来完成此操作。 结果是一个禁用但开始的服务,无论其以前的状态如何。 这对于在发布升级期间暂时启动服务很有用。 使用start_disabled和序列enable,start和disable之间的区别在于,所有其他erlsrv命令在start_disable中的操作序列期间被锁定,从erlsrv用户的角度使操作原子化。

erlsrv remove <service-name>

完全删除所有注册选项的服务。它在被移除之前停止。

erlsrv list [<service-name>]

如果未指定服务名称,则会显示所有Erlang服务的简要列表。如果提供服务名称,则会显示该服务的所有选项。

erlsrv help

显示简短的帮助文本。

环境

作为服务启动的Erlang机器的环境包含两个特殊变量:

ERLSRV_SERVICE_NAME启动机器的服务的名称。可以用来操纵服务ERLSRV_EXECUTABLE的完整路径erlsrv.exe。当为您的服务定义心脏命令时,这会派上用场。

用于重新启动服务的命令文件如下所示:

@echo off
%ERLSRV_EXECUTABLE% stop %ERLSRV_SERVICE_NAME%
%ERLSRV_EXECUTABLE% start %ERLSRV_SERVICE_NAME%    

这个命令文件然后被设置为心脏命令。

环境变量也可用于检测我们作为服务运行并使端口程序正确地对注销时生成的控制事件作出反应(请参阅下一节)。

端口程序

当程序在服务上下文中运行时,它必须处理交互式用户注销时发送给系统中每个程序的控制事件。 这对于在控制台子系统中运行的程序和作为窗口应用程序运行的程序以不同的方式完成。 在控制台子系统中运行的应用程序(通常用于端口程序)使用win32函数SetConsoleCtrlHandler来注册一个控制处理程序,该程序处理程序在回答CTRL_LOGOFF_EVENT和CTRL_SHUTDOWN_EVENT事件时返回true。 其他应用程序仅将WM_ENDSESSION和WM_QUERYENDSESSION转发到默认窗口过程。

如何设置控制台控制处理程序的简单示例:

#include <windows.h>
/* 
** A Console control handler that ignores the log off events,
** and lets the default handler take care of other events.
*/   
BOOL WINAPI service_aware_handler(DWORD ctrl){
    if(ctrl == CTRL_LOGOFF_EVENT)
        return TRUE;
    if(ctrl == CTRL_SHUTDOWN_EVENT)
        return TRUE;
    return FALSE;
}

void initialize_handler(void){
    char buffer[2];
    /* 
     * We assume we are running as a service if this  
     * environment variable is defined.
     */
    if(GetEnvironmentVariable("ERLSRV_SERVICE_NAME",buffer,
                              (DWORD) 2)){
        /*
        ** Actually set the control handler
        */
        SetConsoleCtrlHandler(&service_aware_handler, TRUE);
    }
}    

注记

虽然这些选项是以类似Unix的格式描述的,但是选项或命令的情况并不相关,字符“/”和“-”都可以用于选项。

请注意,程序驻留在模拟器的bin目录中,而不是bin直接位于Erlang根目录下的目录中。其原因是在正在运行的系统上升级仿真器的微妙问题,其中新版本的运行时系统不应该覆盖现有的(可能使用的)可执行文件。

要轻松操作Erlang服务,请将<erlang_root>\erts-<version>\bin目录放在路径中而不是<erlang_root>\bin。该erlsrv程序可以从内部Erlang通过使用发现os:find_executable/1Erlang的功能。

要使发布处理正常工作,请使用start_erl作为Erlang机器。如前above所述,服务名称非常重要。

另见

start_erl(1),,,release_handler(3)

Erlang 20

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

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