查看源代码 run_erl

在 Unix 系统上重定向 Erlang 输入和输出流。

描述

run_erl 程序是 Unix 系统特有的。此程序重定向标准输入和标准输出流,以便所有输出都可以被记录。它还允许程序 to_erl 连接到 Erlang 控制台,从而可以远程监视和调试嵌入式系统。

有关使用的更多信息,请参阅系统文档中的 嵌入式系统用户指南

run_erl [-daemon] pipe_dir/ log_dir "exec command arg1 arg2 ..."

参数

  • -daemon - 强烈建议使用此选项。它使 run_erl 在后台运行,完全与任何控制终端分离,并且命令立即返回给调用者。如果没有此选项,则必须在 shell 中使用一些技巧来启动 run_erl,才能使其完全与启动时使用的终端分离。该选项必须是命令行中 run_erl 的第一个参数。

  • pipe_dir - 命名管道,通常为 /tmp/。它必须以 /(斜杠)结尾,即 /tmp/epipes/,而不是 /tmp/epipes

  • log_dir - 日志文件,即

    • 一个日志文件,run_erl.log,记录 run_erl 程序本身的进度和警告。

    • 最多五个日志文件,每个文件最大 100 KB,包含来自命令和发送到命令的标准流的内容。(日志的数量和大小都可以通过环境变量更改,请参阅下面的 环境变量 部分。)

      当日志满了时,run_erl 会删除并重用最旧的日志文件。

  • "exec command arg1 arg2 ..." - 一个以空格分隔的字符串,指定要执行的程序。第二个字段通常是命令名,例如 erl

关于日志文件的说明

运行时,run_erl 将所有未解释的输出发送到日志文件。该文件名为 erlang.log.N,其中 N 是一个整数。当日志“满”时(默认日志大小为 100 KB),run_erl 开始在文件 erlang.log.(N+1) 中记录,直到 N 达到某个数字(默认为 5),然后 N 再次从 1 开始,最旧的文件开始被覆盖。

如果 Erlang shell 没有输出,但 Erlang 机器似乎仍然处于活动状态,则会向日志写入“ALIVE”消息;它是一个时间戳,默认情况下,在 15 分钟不活动后写入。此外,如果记录了 Erlang 的输出,但自从上次从 Erlang 收到任何信息以来已过去 5 分钟以上(默认),则会在日志中写入一个时间戳。“ALIVE”消息如下所示:

===== ALIVE <date-time-string>

另一个时间戳如下所示:

===== <date-time-string>

date-time-string 是写入消息的日期和时间,默认情况下为本地时间(如果需要,可以更改为 UTC)。它使用 ANSI-C 函数 strftime 和格式字符串 %a %b %e %T %Z %Y 进行格式化,该格式字符串生成类似 ===== ALIVE Thu May 15 10:13:36 MEST 2003 的消息;可以更改此设置,请参阅下一节。

环境变量

run_erl 可以识别以下环境变量,并更改日志记录行为。有关更多信息,请参阅上一节。

  • RUN_ERL_LOG_ALIVE_MINUTES - 在向日志写入“ALIVE”消息之前等待输出的时间(以分钟为单位)。默认为 15,最小值为 1。

  • RUN_ERL_LOG_ACTIVITY_MINUTES - Erlang 需要不活动多长时间,输出之前才会加上时间戳。默认为 RUN_ERL_LOG_ALIVE_MINUTES div 3,最小值为 1。

  • RUN_ERL_LOG_ALIVE_FORMAT - 指定要在 strftime C 库调用中使用的另一个格式字符串。也就是说,将其指定为 "%e-%b-%Y, %T %Z" 会生成时间戳类似于 15-May-2003, 10:23:04 MET 的日志消息。有关更多信息,请参阅 C 库函数 strftime 的文档。默认为 "%a %b %e %T %Z %Y"

  • RUN_ERL_LOG_ALIVE_IN_UTC - 如果设置为除 0 以外的任何值,则使 run_erl 显示的所有时间都为 UTC(GMT、CET、MET,不包含夏令时),而不是本地时间。这不会影响来自 Erlang 的数据,只会影响 run_erl 直接输出的日志。可以通过将 Erlang 应用程序变量 utc_log 设置为 true 来相应地修改应用程序 SASL。

  • RUN_ERL_LOG_GENERATIONS - 控制在重用旧文件之前写入的日志文件的数量。默认为 5,最小值为 2,最大值为 1000。

    请注意,为了指示最新文件,run_erl 将删除最旧的日志文件,以在文件序列中保持一个“空洞”。例如,如果存在日志文件 #1、#2、#4 和 #5,则表示 #2 是最新的,#4 是最旧的。因此,您最多会获得比 RUN_ERL_LOG_GENERATIONS 设置的值少一个的日志文件。

  • RUN_ERL_LOG_MAXSIZE - 在切换到新日志文件之前,日志文件的大小(以字节为单位)。默认为 100000,最小值为 1000,最大值约为 2^30。

  • RUN_ERL_DISABLE_FLOWCNTRL - 如果定义,则禁用 run_erl 打开的 pty 的输入和输出流量控制。如果您想消除因使用 Ctrl-S(而不是 Ctrl-D 来分离)而意外阻止流量控制的任何风险,这将非常有用,这可能导致整个 Beam 进程被阻止,并且在运行 heart 作为 supervisor 的情况下,当向终端写入日志消息时,甚至 heart 进程也会被阻止,从而使 heart 进程无法工作。

另请参阅

start(1), start_erl(1)