You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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"

问题分析

  1. 后台执行导致顺序失控:用nohup ... &将脚本放到后台后,pidof可能无法准确获取目标进程PID(比如同名进程存在、脚本启动后PID已变更),导致wait未等待正确进程就继续执行下一行,引发顺序混乱。
  2. 缺少失败检查:未判断脚本的退出状态码,无法得知脚本是否执行成功,无法触发告警逻辑。

解决方案

直接前台执行脚本,通过检查退出状态码控制执行流程,同时添加邮件告警逻辑:

完整控制脚本示例

#!/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 06:47:54