Shell
功能
通过Shell节点执行用户指定的Shell脚本。
Shell节点的后续节点可以通过EL表达式#{Job.getNodeOutput()},获取Shell脚本最后4000字符的标准输出。
使用示例:
获取某个Shell脚本(脚本名称为shell_job1)输出值包含“<name>jack<name1>”的内容,EL表达式如下所示:
#{StringUtil.substringBetween(Job.getNodeOutput("shell_job1"),"<name>","<name1>")} 数据开发中的shell作业,是根据脚本执行返回值判断脚本执行成功还是失败。 如果返回值是0,则判断脚本执行成功。非0为失败。
参数
| 参数 | 是否必选 | 说明 |
|---|---|---|
| 节点名称 | 是 | 节点名称,只能包含英文字母、数字、中文字符、中划线、下划线、/、<>和点号,且长度小于等于128个字符。 默认情况下,节点名称会与选择的脚本名称保持同步。若不需要节点名称和脚本名称同步,请参考禁用作业节点名称同步变化禁用该功能。 |
| Shell或脚本 | 是 | 可以选择Shell语句或Shell脚本。 |
| 主机连接 | 是 | 选择执行Shell脚本的主机。 须知:
|
| 参数 | 否 | 填写执行Shell脚本时,向脚本传递的参数,参数之间使用空格分隔,例如:a b c。此处的“参数”需要在Shell脚本中引用,否则配置无效。 说明: 请勿输入敏感信息,例如ak、sk、password、authorization等信息。 |
| 交互式输入 | 否 | 填写交互式参数,即执行Shell脚本的过程中,需要用户输入的交互式信息(例如密码)。交互式参数之间以空格分隔,Shell脚本根据交互情况按顺序读取参数值。 read -p语法的使用示例: read -p “输入参数1和参数2”变量1 变量2 说明: 请勿输入敏感信息,例如ak、sk、password、authorization等信息。 |
| 容器环境变量 | 否 | 容器运行时的环境变量配置,容器的环境变量要支持可传入空间变量/常量。 支持单个添加和批量添加。 批量添加时,通过文本模式,可以批量添加多个资源配置,最多添加100条。多个配置之前使用英文分号分隔。例如:aa=1;bb=2。 说明: 如果您要使用敏感参数,并且要在AI DataLake进行加密,则需要填写特定的参数,否则不会在AI DataLake进行加密。特定参数包含pwd、passwd、password、token、sk、truststore、secretkey、access_key,ak等,不区分大小写。 |
| 参数 | 是否必选 | 说明 |
|---|---|---|
| 节点状态轮询时间(秒) | 是 | 设置轮询时间(1~60秒),每隔x秒查询一次节点是否执行完成。 |
| 节点执行的最长时间 | 是 | 设置节点执行的超时时间,如果节点配置了重试,在超时时间内未执行完成,该节点将会再次重试。 |
| 失败重试 | 是 | 节点执行失败后,是否重新执行节点。
|
| 重试条件 | 否 | 失败重试选择“是”时,支持设置重试条件。 打开重试条件的开关,设置返回码的范围。 Shell作业可以根据返回码判断作业节点执行失败是否重试。用户可以定义Shell的返回结果码中哪些返回码可以重跑。 |
| 当前节点失败后,后续节点处理策略 | 是 | 节点执行失败后的操作:
|
| 是否空跑 | 否 | 如果勾选了空跑,该节点不会实际执行,将直接返回成功。 |
| 任务组 | 否 | 选择任务组。任务组配置好后,可以更细粒度地进行当前任务组中的作业节点的并发数控制,比如作业中包含多个节点、补数据、重跑等场景。 |
Shell节点:Shell作业算子示例
在华为云数据开发服务中,当Shell作业的运行环境配置为ECS(弹性云服务器)时,通常通过“参数”配置传递变量,并通过Shell脚本的标准输入或命令行参数处理交互逻辑。
- 参数配置示例
在作业配置界面的“参数”标签页中,你可以定义输入参数。假设我们定义两个参数:
- input_date:输入日期,默认值2023-10-01。
- output_path:输出路径,默认值/tmp/output。
配置方式:
- 参数名称:input_date
- 参数值:${input_date}(在脚本中引用)
- 参数名称:output_path
- 参数值:${output_path}(在脚本中引用)
- Shell脚本内容示例
在“脚本”编辑区域,编写Shell脚本以使用这些参数。或者在Shell脚本中
#!/bin/bash # 获取传入的参数 # 注意:在DataArts Studio中,参数通常通过环境变量或命令行参数传递,具体取决于版本和配置方式。 # 常见方式是通过环境变量 $INPUT_DATE 和 $OUTPUT_PATH,或者在脚本开头解析。 # 假设参数通过环境变量传递(这是云数据平台常见的做法): INPUT_DATE="${input_date}" OUTPUT_PATH="${output_path}" echo "开始执行Shell作业..." echo "输入日期: ${INPUT_DATE}" echo "输出路径: ${OUTPUT_PATH}" # 创建输出目录 mkdir -p ${OUTPUT_PATH} # 示例逻辑:生成一个包含日期的文件 echo "Job executed on ${INPUT_DATE}" > ${OUTPUT_PATH}/result.txt echo "作业执行完成,结果已保存至${OUTPUT_PATH}/result.txt" - 关于“交互式输入”
在云数据平台的自动化作业调度环境中,通常不支持也不推荐使用标准的交互式输入(如read命令等待用户键盘输入),因为作业是在后台非交互式Shell环境中运行的。
如果需要动态输入,建议采用以下方式替代:
- 使用参数传递:如上所示,通过作业配置中的“参数”功能传入所需值。
- 使用配置文件:将配置信息写入文件,脚本读取文件内容。
- 使用环境变量:在ECS运行环境中,平台可能会注入特定的环境变量,脚本可直接读取。
如果必须模拟交互(不推荐用于生产调度):
可以使用echo将输入重定向到read,但这通常用于测试而非正式作业。
# 不推荐的交互式写法(在自动化环境中会挂起或失败) # read -p "请输入日期: " INPUT_DATE # 推荐的非交互式写法 INPUT_DATE="${input_date}" # 从作业参数获取