【FFmpeg 智慧园区场景应用】3.Shell脚本增强:故障自动重启 + 磁盘监控告警

FFmpeg 智慧园区脚本增强:故障自动重启 + 磁盘监控告警

接上篇,Shell 脚本补充 故障自动重启机制磁盘空间监控告警功能,解决园区 24h 运行中脚本异常中断、存储溢出的问题,进一步提升自动化运维的稳定性和可控性。

一、 增强功能 1:摄像头录制脚本(camera_record.sh)故障自动重启

增强说明

  1. 采用「无限循环 + 进程监控」机制,脚本异常退出后 10 秒自动重启
  2. 记录重启日志,便于排查高频重启原因
  3. 保留原有的分段录制功能,仅增加重启逻辑,不影响原有使用
  4. 避免无限重启风暴,增加重启间隔(10 秒),减轻服务器压力

增强后完整脚本(替换原 camera_record.sh

bash 复制代码
#!/bin/bash
# 智慧园区摄像头自动分段录制脚本(带故障自动重启)
# 配置参数(根据园区实际情况修改)
RTSP_URL="rtsp://admin:123456@192.168.1.100:554/stream1"  # 摄像头RTSP地址
CAMERA_ID="cam001"  # 摄像头编号(用于文件命名)
SAVE_DIR="/data/park/record"  # 录像保存目录
SEGMENT_TIME=3600  # 每段录像时长(秒),1小时=3600秒
LOG_FILE="/data/park/logs/camera_${CAMERA_ID}_record.log"  # 日志文件路径
RESTART_INTERVAL=10  # 异常重启间隔(秒)

# 步骤1:创建保存目录和日志目录
mkdir -p ${SAVE_DIR}
mkdir -p $(dirname ${LOG_FILE})

# 步骤2:定义录制核心函数
record_core() {
    ffmpeg -y \
    -rtsp_transport tcp \
    -i ${RTSP_URL} \
    -c copy \
    -f segment \
    -segment_time ${SEGMENT_TIME} \
    -segment_format mp4 \
    -segment_filename "${SAVE_DIR}/${CAMERA_ID}_%Y%m%d_%H%M%S.mp4" \
    -v error \
    >> ${LOG_FILE} 2>&1
}

# 步骤3:无限循环 + 自动重启逻辑
echo "=====================================" >> ${LOG_FILE}
echo "$(date +'%Y-%m-%d %H:%M:%S') - 摄像头${CAMERA_ID}录制脚本(带自动重启)启动" >> ${LOG_FILE}
echo "RTSP地址:${RTSP_URL}" >> ${LOG_FILE}
echo "录像保存目录:${SAVE_DIR}" >> ${LOG_FILE}
echo "每段时长:${SEGMENT_TIME}秒,重启间隔:${RESTART_INTERVAL}秒" >> ${LOG_FILE}

while true; do
    # 执行核心录制逻辑
    record_core

    # 脚本异常退出,记录重启日志
    exit_code=$?
    echo "$(date +'%Y-%m-%d %H:%M:%S') - 摄像头${CAMERA_ID}录制进程异常退出(退出码:${exit_code})" >> ${LOG_FILE}
    echo "$(date +'%Y-%m-%d %H:%M:%S') - ${RESTART_INTERVAL}秒后自动重启录制进程..." >> ${LOG_FILE}

    # 重启间隔,避免高频重启
    sleep ${RESTART_INTERVAL}
done

增强后使用说明

  1. 保留原有赋予执行权限命令:chmod +x camera_record.sh

  2. 后台运行不变:nohup ./camera_record.sh &

  3. 查看重启日志:grep "自动重启" /data/park/logs/cam001_record.log

  4. 如需停止脚本(正常维护):

    bash 复制代码
    # 查找进程ID并终止
    ps -ef | grep camera_record.sh | grep -v grep | awk '{print $2}' | xargs kill -9

二、 增强功能 2:全局磁盘空间监控告警脚本

功能说明

  1. 监控园区录像存储目录所在磁盘,避免存储溢出导致录制失败
  2. 支持自定义告警阈值(默认 85%,磁盘使用率超过阈值触发告警)
  3. 提供 2 种告警方式(日志记录 + 邮件告警,可扩展至企业微信/钉钉)
  4. 可作为定时任务运行,定期巡检磁盘状态
  5. 自动识别目标目录所在磁盘分区,无需手动配置磁盘路径

告警脚本代码(保存为 disk_monitor_alert.sh

bash 复制代码
#!/bin/bash
# 智慧园区录像存储磁盘空间监控告警脚本
# 配置参数
MONITOR_DIR="/data/park/record"  # 需监控的录像目录(自动识别所在磁盘)
ALERT_THRESHOLD=85  # 磁盘使用率告警阈值(%)
LOG_FILE="/data/park/logs/disk_monitor.log"  # 监控日志文件
# 邮件告警配置(可选,需服务器安装 sendmail/mailx)
ALERT_EMAIL="admin@park.com"  # 接收告警的邮箱地址
ENABLE_EMAIL_ALERT=0  # 是否启用邮件告警(0=禁用,1=启用)

# 步骤1:创建日志目录
mkdir -p $(dirname ${LOG_FILE})

# 步骤2:获取目标目录所在磁盘分区、使用率、总空间、剩余空间
# 识别磁盘分区
DISK_PART=$(df -P ${MONITOR_DIR} | tail -1 | awk '{print $1}')
# 提取磁盘使用率(去除%符号)
DISK_USAGE=$(df -P ${MONITOR_DIR} | tail -1 | awk '{print $5}' | sed 's/%//g')
# 提取总空间
DISK_TOTAL=$(df -hP ${MONITOR_DIR} | tail -1 | awk '{print $2}')
# 提取剩余空间
DISK_FREE=$(df -hP ${MONITOR_DIR} | tail -1 | awk '{print $4}')

# 步骤3:记录监控日志
monitor_log="$(date +'%Y-%m-%d %H:%M:%S') - 磁盘分区:${DISK_PART} | 总空间:${DISK_TOTAL} | 剩余空间:${DISK_FREE} | 使用率:${DISK_USAGE}%"
echo ${monitor_log} >> ${LOG_FILE}

# 步骤4:判断是否触发告警
if [ ${DISK_USAGE} -ge ${ALERT_THRESHOLD} ]; then
    # 构建告警信息
    alert_msg="【智慧园区存储告警】磁盘使用率超过阈值!
    告警时间:$(date +'%Y-%m-%d %H:%M:%S')
    磁盘分区:${DISK_PART}
    总空间:${DISK_TOTAL}
    剩余空间:${DISK_FREE}
    当前使用率:${DISK_USAGE}%
    告警阈值:${ALERT_THRESHOLD}%
    影响:可能导致摄像头录制失败、AI预处理中断,请及时清理历史录像!"

    # 1. 写入告警日志(高亮标记)
    echo "=====================================" >> ${LOG_FILE}
    echo "【告警】${alert_msg}" >> ${LOG_FILE}
    echo "=====================================" >> ${LOG_FILE}

    # 2. 邮件告警(若启用)
    if [ ${ENABLE_EMAIL_ALERT} -eq 1 ]; then
        echo "${alert_msg}" | mail -s "【智慧园区存储告警】磁盘使用率过高" ${ALERT_EMAIL}
        if [ $? -eq 0 ]; then
            echo "$(date +'%Y-%m-%d %H:%M:%S') - 邮件告警已发送至:${ALERT_EMAIL}" >> ${LOG_FILE}
        else
            echo "$(date +'%Y-%m-%d %H:%M:%S') - 邮件告警发送失败,请检查邮件配置" >> ${LOG_FILE}
        fi
    fi
fi

exit 0

脚本使用说明

  1. 赋予执行权限:chmod +x disk_monitor_alert.sh

  2. 手动测试运行:./disk_monitor_alert.sh

  3. 配置定时任务(每 30 分钟巡检一次,推荐):

    bash 复制代码
    # 编辑定时任务
    crontab -e
    # 添加以下内容(每30分钟执行一次磁盘监控)
    */30 * * * * /data/park/scripts/disk_monitor_alert.sh
  4. 启用邮件告警(可选):

    • Ubuntu/Debian 安装邮件工具:sudo apt install mailutils
    • CentOS 安装邮件工具:sudo yum install mailx
    • 修改脚本中 ENABLE_EMAIL_ALERT=1,配置正确的 ALERT_EMAIL
  5. 查看告警日志:grep "【告警】" /data/park/logs/disk_monitor.log

三、 增强功能 3:批量预处理/压缩脚本的「磁盘空间预检」

增强说明

batch_ai_preprocess.shhistory_record_compress.sh 开头添加磁盘空间预检,避免在磁盘使用率超过阈值时继续执行大文件处理,导致磁盘溢出。

改造示例(以 batch_ai_preprocess.sh 为例,添加以下代码在脚本开头)

bash 复制代码
#!/bin/bash
# 智慧园区录像批量AI预处理脚本(带磁盘空间预检)
# 配置参数
INPUT_DIR="/data/park/record"  # 原始录像目录
OUTPUT_DIR="/data/park/ai_input"  # 预处理后保存目录
TARGET_RES="1280x720"  # AI模型目标分辨率(720P)
TARGET_FPS=15  # AI模型目标帧率
LOG_FILE="/data/park/logs/batch_ai_preprocess.log"
ALERT_THRESHOLD=85  # 磁盘使用率告警阈值(%)

# ====== 新增:磁盘空间预检 ======
# 获取输出目录所在磁盘使用率
DISK_USAGE=$(df -P ${OUTPUT_DIR} | tail -1 | awk '{print $5}' | sed 's/%//g')
if [ ${DISK_USAGE} -ge ${ALERT_THRESHOLD} ]; then
    # 写入错误日志并退出
    mkdir -p $(dirname ${LOG_FILE})
    echo "$(date +'%Y-%m-%d %H:%M:%S') - 【错误】磁盘使用率${DISK_USAGE}%超过阈值${ALERT_THRESHOLD}%,停止批量预处理" >> ${LOG_FILE}
    exit 1
fi
# ====== 磁盘空间预检结束 ======

# 后续原有逻辑不变...
mkdir -p ${OUTPUT_DIR}
mkdir -p $(dirname ${LOG_FILE})
# ...(省略原有后续代码,保持不变)

改造说明

  1. history_record_compress.sh 可采用相同逻辑,在脚本开头添加磁盘预检
  2. 预检目标目录为「输出目录」(预处理/压缩后的文件保存目录),更贴合实际场景
  3. 磁盘使用率超过阈值时,脚本直接退出并记录错误日志,不执行后续处理

四、 整体运维优化注意事项

  1. 重启日志排查 :若录制脚本高频重启,优先检查 RTSP_URL 有效性、摄像头在线状态、园区网络稳定性

  2. 告警渠道扩展:可将邮件告警替换为企业微信/钉钉机器人告警,更适合园区运维团队实时接收通知

  3. 日志轮转 :配置 logrotate 定期轮转监控日志,避免日志文件过大占用磁盘空间(示例配置):

    bash 复制代码
    # 编辑 logrotate 配置文件
    sudo vi /etc/logrotate.d/park_ffmpeg
    # 添加以下内容
    /data/park/logs/*.log {
        daily
        rotate 30
        compress
        missingok
        notifempty
        create 0644 root root
    }
  4. 权限加固:脚本运行用户建议使用专用运维用户,避免 root 用户运行带来的安全风险

  5. 进程监控 :可配合 htopnmon 工具监控脚本运行时的 CPU/内存占用,避免影响服务器其他业务

相关推荐
大大祥1 天前
Android FFmpeg集成
android·ffmpeg·kotlin·音视频·jni·ndk·音视频编解码
好多渔鱼好多1 天前
【流媒体】FFmpeg技术介绍与构建方法
ffmpeg
没有羊的王K1 天前
下载安装FFmpeg教程
ffmpeg
kkoral1 天前
【FFmpeg 智慧园区场景应用】1.实战命令清单
ffmpeg
天虎1 天前
使用VS2019编译ShiftMediaProject版本FFmpeg
ffmpeg
kkoral1 天前
【FFmpeg 智慧园区场景应用】2.自动化处理 Shell 脚本
运维·ffmpeg·自动化
代码煮茶君1 天前
FFmpeg 音视频转码全攻略:参数详解与实战指南
ffmpeg·音视频
深念Y2 天前
录屏意外中断的视频修复软件 untrunc
ffmpeg·文件·视频·录屏·软件·修复工具·untrunc
Black蜡笔小新2 天前
国标设备如何在EasyCVR视频汇聚平台获取RTSP/RTMP流?
网络·ffmpeg·音视频