1. 概述
用户在使用 Shell 脚本调用外部任务时,需要了解 FineDataLink 的调用任务是否执行成功。
同时本文给出推荐的 shell 脚本书写方式。
2. 判断 Shell 脚本任务执行成功
FineDataLink 中脚本运行成功或者失败是根据如下进程退出码(exit code)来进行判断的:
退出码 0:表示脚本执行成功。
其它退出码:表示失败。
注1:如果 exit 没有指定数字,则默认为exit 0,即脚本执行成功。
注2:exit 命令是退出命令,当脚本执行到 exit 时整个 Shell 就会退出执行,不会再执行后续命令。
2.1 脚本中直接调用 exit
比如下面这个脚本,结尾直接调用了 exit,没有指定数字,那么默认为 exit 0,即脚本执行成功:
Shell 脚本执行该脚本,在 FineDataLink 节点执行结果就一定是成功的。
2.2 脚本中不调用 exit
此时整个 Shell 脚本的退出码(exit code)和脚本中最后一条命令一致。
例如这样一个脚本
lss
echo 66
执行结果可以看到第一个命令执行失败,第二个命令执行成功。此时使用$? 可以获取到上一个命令的 exit code,那么此时 Shell 脚本的退出码(exit code)就是 0,即执行成功,如下图所示:
FineDataLink 中也会认为整个 Shell 脚本执行成功,在运行日志中返回执行成功说明。
将同样的命令执行顺序对调一下,执行结果可以看到第一个命令执行成功,第二个命令执行失败。此时使用$?可以获取到上一个命令的 exit code,那么此时 Shell 脚本的退出码(exit code)就是 127,即执行失败,如下图所示:
FineDataLink 中也会认为整个 Shell 脚本执行失败。
3. 推荐的脚本书写方式
基于本文第二章的说明,给出推荐的脚本书写方式:
1)推荐一个 Shell 脚本中执行一个任务,且在脚本结尾不要调用 exit 。以保证在 FineDataLink 中任务运行日志返回结果总是准确的。
2)如果业务场景中需要实现一个 Shell 脚本执行多个任务,可以结合判断脚本的成功还是失败,用$?以及参数赋值,获取脚本中每个任务的 exit code 并进行乘法或者加法运算实现整个脚本执行结果判断。
3.1 Shell 脚本中任一任务执行失败,节点算执行失败
将多个返回码 exit code 进行加法运算。只要有一个任务执行失败(不为0),最终返回码就是不为0,即整个 Shell 脚本执行失败。
例如某脚本如下:
echo 666
lss
echo log
ls
将每个任务后都设置参数赋值任务执行结果,例如 lss 执行后取出其返回码并赋值给 a ,并在脚本最后将所有任务的执行结果相加。
echo 666
lss
a=$?
echo log
ls
b=$?
exit `expr $a + $b`
然后使用命令执行任务,会发现 lss 任务执行失败,如下图所示:
使用命令 echo $? 查看任务执行结果,即可看到返回值为 127,即整个 Shell 脚本任务执行失败,如下图所示:
此时在 FineDataLink 中执行任务,日志提示任务执行失败,如下图所示:
3.2 Shell 脚本中任一任务执行成功,节点算作执行成功
将多个返回码 exit code 进行乘法运算。只要有一个任务执行成功(为0),最终返回码就是0,即整个 Shell 脚本执行成功。
将每个任务后都设置参数赋值任务执行结果,例如 lss 执行后取出其返回码并赋值给 a ,并在脚本最后将所有任务的执行结果相乘。
echo 666
lss
a=$?
echo log
ls
b=$?
exit `expr $a \* $b`
执行脚本,虽然 lss 任务执行失败,但是任务返回码为 0 ,即执行成功。
此时在 FineDataLink 中执行任务,日志提示任务执行成功,如下图所示:
注:如果需要更详细的日志输出,可将日志等级调整为INFO:日志等级设置