Bash串行执行脚本序列时如何重定向stderr并获取失败脚本名称
需求说明
- 搭建邮件通知系统,需要将执行失败的脚本信息存入txt文件,每日运行一次Python脚本读取该文件,整合所有失败任务内容后发送通知邮件
- 当前任务执行链路分两类:
- Python脚本执行链:
script1.py && script2.py && ... && scriptN.py 2>> "/home/mydir/failedscripts.txt" - 带入参的Shell脚本执行链:
script1.sh && script2.sh arg1 && ... && scriptN.sh 2>> "/home/mydir/failedscripts.txt"
- Python脚本执行链:
- 现有stderr重定向功能运行正常,新增要求:除原有错误输出外,需要将失败脚本的名称、字符串
DONE一同追加写入/home/mydir/failedscripts.txt
已尝试的失效方案
- 方案1:
script1 && script2 && .. && scriptN 2>> "/home/mydir/failedscripts.txt" || echo $_,"done">> "/home/mydir/failedscripts.txt" - 方案2:
script1 && script2 && .. && scriptN 2>> "/home/mydir/failedscripts.txt" ; echo $_,"done">> "/home/mydir/failedscripts.txt" - 方案3:
script1 && script2 && .. && scriptN 2>> "/home/mydir/failedscripts.txt" && echo $_,"done">> "/home/mydir/failedscripts.txt"
以上三种写法最终仅会向目标文件写入
failedscripts.txt,done,完全不符合预期。
问题根因与实现方案
- 根因:shell内置变量
$_的语义为上一条执行命令的最后一个参数,在当前场景下就是stderr重定向的目标文件路径,因此输出的内容永远是文件路径相关的文本,而非失败脚本的名称。 - 要精准捕获链路中执行失败的脚本名称,不能依赖简单的命令拼接逻辑,需要为每个独立执行的脚本绑定单独的失败捕获分支,参考实现如下:
script1.py 2>> "/home/mydir/failedscripts.txt" || echo "script1.py DONE" >> "/home/mydir/failedscripts.txt" \ && script2.sh arg1 2>> "/home/mydir/failedscripts.txt" || echo "script2.sh arg1 DONE" >> "/home/mydir/failedscripts.txt" \ && scriptN.py 2>> "/home/mydir/failedscripts.txt" || echo "scriptN.py DONE" >> "/home/mydir/failedscripts.txt" - 实现效果:原有
&&串联的执行逻辑不变,只要前置脚本执行失败,后续脚本就会终止运行;每个脚本单独配置stderr重定向,执行失败时自动将脚本名称与DONE标记追加写入目标文件,完全匹配Python脚本读取文件拆分失败条目的需求。
内容的提问来源于stack exchange,提问作者amaliebanan
相关产品推荐
相关产品推荐

