ExecuteStreamCommand

文档中心 › 组件索引 › ExecuteStreamCommand

ExecuteStreamCommand Processor

类型全限定名:cn.org.acal.lynxus.processors.standard.ExecuteStreamCommand

所属 Bundle:cn.org.acal.lynxus:lynxus-standard-nar:2.11.8

描述

ExecuteStreamCommand 处理器提供了一种将外部命令和脚本集成到 Lynxus 数据流中的灵活方法。 ExecuteStreamCommand 可以将传入的 FlowFile 的内容传递给它执行的命令,其执行方式与管道的工作方式类似。

标签

command executioncommandstreamexecute

属性

下表中,加粗的属性为必填项;其余为可选项。表格同时标注默认值、是否支持表达式语言,以及是否为敏感属性(值会被加密)。

名称默认值可选值描述
Working Directory执行命令时用作当前工作目录的目录
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Command Path指定要执行的命令; 如果仅提供可执行文件的名称,则它必须位于用户的环境 PATH 中。
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Command Arguments StrategyCommand Arguments Property
  • 命令参数属性 — 要提供给可执行文件的参数取自“命令参数”属性
  • 动态属性参数 — 要提供给可执行文件的参数取自模式为 'command.argument.<commandIndex>' 的动态属性
配置提供给命令的参数的策略。
Command Arguments提供给由“;”分隔的可执行文件的参数 特点。
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Argument Delimiter;用于分隔命令参数的分隔符 [默认值:;]。 必须是单个字符
Ignore STDINfalse
  • true
  • false
如果为 true,则传入 FlowFile 的内容将不会传递给正在执行的命令
Output Destination Attribute如果设置,流命令的输出将被放入原始 FlowFile 的属性中,而不是单独的 FlowFile。将不再有 'output stream' 或 'nonzero status' 的关系。此属性的值将是输出属性的键。
Max Attribute Length256如果将流命令的输出路由到属性中,则放入属性值的字符数最多为此数量。这很重要,因为属性保存在内存中,大属性会很快导致内存溢出问题。如果输出超过此值,将被截断以适应。如果可以的话,请考虑将此值设置得更小。
Output MIME Type指定要为 \"mime.type\" 属性设置的值。如果设置了 'Output Destination Attribute',则忽略此属性。

动态属性

动态属性允许用户自定义属性的名称与值。

名称值描述
环境变量名称环境变量的值这些环境变量被传递给此处理器生成的进程
command.argument.<commandIndex>要提供给命令的参数使用命令参数策略时,这些参数被提供给此处理器生成的进程:动态属性参数。<commandIndex> 是一个数字,它将决定顺序。

关系 (Relationships)

名称描述自动终止
nonzero status当命令返回非零状态码时,从命令输出创建的 FlowFile 的目标路径。所有路由到此关系的 FlowFile 将被惩罚。否
original原始 FlowFile 将被路由。 它将具有详细说明脚本执行结果的新属性。否
output stream如果返回的状态代码为零,则为从命令的输出创建的 FlowFile 的目标路径。否

写入的 FlowFile 属性

名称描述
execution.command执行的命令的名称
execution.command.args以分号分隔的参数列表。 敏感属性将被屏蔽
execution.status执行命令返回的退出状态码
execution.error执行命令返回的任何错误消息
mime.type如果设置了“输出 MIME 类型”属性且未设置“输出目标属性”,则设置输出的 MIME 类型

状态管理

该组件不存储状态。

受限 (Restricted)

该组件不受限。

输入要求

该组件要求有传入连接。

详细说明

ExecuteStreamCommand

说明

ExecuteStreamCommand Processor 提供了一种灵活的方式,把外部命令和脚本集成到 Lynxus 数据流中。 ExecuteStreamCommand 可以像管道(pipe)一样,把传入 FlowFile 的内容传递给它所执行的命令。

配置选项

Working Directory(工作目录)

不指定时,默认工作目录为 Lynxus 根目录。

配置命令参数

ExecuteStreamCommand Processor 提供两种指定命令参数的方式:使用动态属性(Dynamic Properties) 或使用 Command Arguments 字段。

Command Arguments 字段

这是默认方式。如果有多个参数,需要用 Argument Delimiter 字段中指定的字符分隔。需要时可以传入 '-' 和 '--',但此时 Argument Delimiter 应当使用其他字符。

假设我们要列出一个与工作目录不同的目录下的所有文件:

Command Path Command Arguments
ls -lah;/path/to/dir

注意: 命令应当在 $PATH 中,或者位于工作目录中,否则还需要指定路径。

动态属性(Dynamic Properties)

参数也可以通过动态属性指定。符合 'command.argument.' 模式的动态属性会按升序 追加到命令上。

上面的例子用动态属性表示如下:

属性名 属性值
command.argument.0 -lah
command.argument.1 /path/to/dir

配置环境变量

除了使用 Command Arguments 字段或动态属性指定命令参数外,用户还可以在 ExecuteStreamCommand Processor 中使用环境变量。环境变量是系统中运行的进程可以访问的一组键值对。 ExecuteStreamCommand 会把所有不匹配 'command.argument.' 模式的动态属性 都当作环境变量处理。

假设我们要用该 Processor 执行一个 Maven 命令。如果系统中安装了多个 Java 版本,可以通过设置 JAVA_HOME 环境变量来指定使用哪个版本。如果用 --version 参数运行 mvn 命令,输出的 FlowFile 内容如下:

Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63) 
Maven home: /path/to/maven/home Java version: 11.0.18, vendor: Eclipse Adoptium, runtime: /path/to/default/java/home 
Default locale: en_US, platform encoding: UTF-8 OS name: "mac os x", version: "13.1", arch: "x86_64", family: "mac"
属性名 属性值
JAVA_HOME path/to/another/java/home

指定 JAVA_HOME 属性之后,可以发现 Maven 使用了不同的运行时:

Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63) 
Maven home: /path/to/maven/home Java version: 11.0.18, vendor: Eclipse Adoptium, runtime: /path/to/another/java/home 
Default locale: en_US, platform encoding: UTF-8 OS name: "mac os x", version: "13.1", arch: "x86_64", family: "mac"

以流式方式向命令输入

ExecuteStreamCommand 会像管道一样,把传入 FlowFile 的内容传递给它执行的命令。可以通过 Ignore STDIN 属性禁用此行为。上面的示例没有用到传入 FlowFile 的内容,因此那种情况下可以利用 该属性获得额外的性能提升。

要利用流式输入能力,假设我们想对 FlowFile 使用 grep:假设需要从 Apache HTTPD 日志中列出 所有 POST 请求:

127.0.0.1 - - [03/May/2023:13:54:26 +0000] "GET /example-page HTTP/1.1" 200 4825 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" 
127.0.0.1 - - [03/May/2023:14:05:32 +0000] "POST /submit-form HTTP/1.1" 302 0 "http://localhost/example-page" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" 
127.0.0.1 - - [03/May/2023:14:10:48 +0000] "GET /image.jpg HTTP/1.1" 200 35785 "http://localhost/example-page" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" 
127.0.0.1 - - [03/May/2023:14:20:15 +0000] "GET /example-page HTTP/1.1" 200 4825 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0" 
127.0.0.1 - - [03/May/2023:14:30:42 +0000] "GET /example-page HTTP/1.1" 200 4825 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0"

Processor 配置:

Working Directory Command Path Command Arguments Strategy Command Arguments Argument Delimiter Ignore STDIN Output Destination Attribute Max Attribute Length
grep Command Arguments Property POST ; false 256

这样,"output stream" Relationship 上输出的 FlowFile 应当是:

127.0.0.1 - - [03/May/2023:14:05:32 +0000] "POST /submit-form HTTP/1.1" 302 0 "http://localhost/example-page" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0"