【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/内存占用,避免影响服务器其他业务

相关推荐
Echo_NGC223711 小时前
【FFmpeg 使用指南】Part 3:码率控制策略与质量评估体系
人工智能·ffmpeg·视频·码率
xmRao18 小时前
Qt+FFmpeg 实现 PCM 音频转 AAC 编码
qt·ffmpeg·pcm
xmRao18 小时前
Qt+FFmpeg 实现录音程序(pcm转wav)
qt·ffmpeg
阿里巴啦2 天前
python+yt-dlp开源项目,支持 YouTube, Bilibili, TikTok/抖音,快手 等多个平台的视频/音频/字幕下载/ai摘要等功能
python·ffmpeg·whisper·音视频·视频处理·ai摘要·音视频转录
来鸟 鸣间3 天前
linux下ffmpeg源码编译
linux·运维·ffmpeg
Echo_NGC22373 天前
【FFmpeg使用指南】Part 2:滤镜图架构与信号处理
架构·ffmpeg·音视频·信号处理
Echo_NGC22373 天前
【FFmpeg使用指南】Part 1:核心架构与媒体流处理
ffmpeg·音视频·媒体·视频
ssxueyi3 天前
用 Claude Code 从零开发自己的Direct3D 硬件加速播放器
ffmpeg·ai编程·directx·视频播放器·从零开始·claude code·csdn征文活动
Yan_uuu3 天前
ubuntu18.04 安装 x264、ffmpeg、nv-codec-hearers 支持GPU硬件加速
c++·图像处理·ubuntu·ffmpeg
runner365.git4 天前
做一个基于ffmpeg的AI Agent智能体
人工智能·ffmpeg·大模型