如何实现Bash脚本按序执行:前序成功再运行+失败邮件告警
按顺序执行Bash脚本并处理成功/失败逻辑
需求背景
有三个脚本需要按依赖顺序执行,具体作用:
fgaudext1.sh(Script1):删除遗留文件并复制新文件用于处理fgaudext2.sh(Script2):为新复制的文件执行COBOL程序fgaudext3.sh(Script3):执行另一个COBOL程序进行对比并压缩所需输出文件
要求实现:
- 仅当前一个脚本成功完成时,才执行下一个脚本
- 全部脚本执行完成后,发送任务完成邮件
- 任意脚本执行失败时,发送对应失败脚本的告警邮件
当前问题
手动执行可按序完成,但尝试自动化的代码出现执行顺序混乱(如Script3先于Script2执行),且缺少失败检查机制。尝试的代码如下:
#!/bin/sh # nohup ./fgaudext1.sh >/data/shell/fgaud/log/nohup_fgaudext1.txt 2>&1 & pid_1=$(pidof fgaudext1.sh) wait ${pid_1} nohup ./fgaudext2.sh >/data/shell/fgaud/log/nohup_fgaudext2.txt 2>&1 & # pid_2=$(pidof fgaudext2.sh) wait ${pid_2} nohup ./fgaudext3.sh >/data/shell/fgaud/log/nohup_fgaudext3.txt 2>&1 & # pid_3=$(pidof fgaudext3.sh) wait ${pid_3} # echo "Recon complete for AUDIT files"
问题分析
- 后台执行导致顺序失控:用
nohup ... &将脚本放到后台后,pidof可能无法准确获取目标进程PID(比如同名进程存在、脚本启动后PID已变更),导致wait未等待正确进程就继续执行下一行,引发顺序混乱。 - 缺少失败检查:未判断脚本的退出状态码,无法得知脚本是否执行成功,无法触发告警逻辑。
解决方案
直接前台执行脚本,通过检查退出状态码控制执行流程,同时添加邮件告警逻辑:
完整控制脚本示例
#!/bin/bash # 配置邮件参数(根据实际环境修改) SUCCESS_RECEIVER="your-success-email@example.com" ALERT_RECEIVER="your-alert-email@example.com" EMAIL_SUBJECT_PREFIX="AUDIT任务执行通知" # 配置日志目录 LOG_DIR="/data/shell/fgaud/log" mkdir -p "$LOG_DIR" # 确保日志目录存在,避免写入失败 # 执行Script1并检查结果 echo "开始执行Script1: 清理遗留文件并复制新文件" ./fgaudext1.sh > "${LOG_DIR}/fgaudext1.log" 2>&1 if [ $? -ne 0 ]; then echo "Script1执行失败,日志路径:${LOG_DIR}/fgaudext1.log" | mail -s "${EMAIL_SUBJECT_PREFIX} - Script1执行失败" "$ALERT_RECEIVER" exit 1 fi # 执行Script2并检查结果 echo "Script1执行成功,开始执行Script2: 运行COBOL处理程序" ./fgaudext2.sh > "${LOG_DIR}/fgaudext2.log" 2>&1 if [ $? -ne 0 ]; then echo "Script2执行失败,日志路径:${LOG_DIR}/fgaudext2.log" | mail -s "${EMAIL_SUBJECT_PREFIX} - Script2执行失败" "$ALERT_RECEIVER" exit 1 fi # 执行Script3并检查结果 echo "Script2执行成功,开始执行Script3: 对比并压缩输出文件" ./fgaudext3.sh > "${LOG_DIR}/fgaudext3.log" 2>&1 if [ $? -ne 0 ]; then echo "Script3执行失败,日志路径:${LOG_DIR}/fgaudext3.log" | mail -s "${EMAIL_SUBJECT_PREFIX} - Script3执行失败" "$ALERT_RECEIVER" exit 1 fi # 全部任务完成,发送成功通知 echo "所有AUDIT任务执行完成,日志路径:${LOG_DIR}" | mail -s "${EMAIL_SUBJECT_PREFIX} - 任务全部完成" "$SUCCESS_RECEIVER" echo "Recon complete for AUDIT files"
关键说明
- 前台执行避免顺序问题:直接运行脚本而非后台启动,确保上一个脚本执行完成后才会执行下一行命令。
- 退出状态码检查:
$?表示上一个命令的退出状态,0为成功,非0为失败,以此判断是否继续执行后续脚本。 - 日志与告警:每个脚本的输出写入独立日志文件,失败时邮件中包含日志路径,方便排查问题。
- 后台运行整个任务:如果需要让整个控制脚本在后台运行,可执行:
nohup ./control_script.sh > "${LOG_DIR}/control.log" 2>&1 &
内容的提问来源于stack exchange,提问作者Rahul Dubey
相关产品推荐
相关产品推荐

