FFmpeg 智慧园区脚本增强:故障自动重启 + 磁盘监控告警
接上篇,Shell 脚本补充 故障自动重启机制 和 磁盘空间监控告警功能,解决园区 24h 运行中脚本异常中断、存储溢出的问题,进一步提升自动化运维的稳定性和可控性。
一、 增强功能 1:摄像头录制脚本(camera_record.sh)故障自动重启
增强说明
- 采用「无限循环 + 进程监控」机制,脚本异常退出后 10 秒自动重启
- 记录重启日志,便于排查高频重启原因
- 保留原有的分段录制功能,仅增加重启逻辑,不影响原有使用
- 避免无限重启风暴,增加重启间隔(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
增强后使用说明
-
保留原有赋予执行权限命令:
chmod +x camera_record.sh -
后台运行不变:
nohup ./camera_record.sh & -
查看重启日志:
grep "自动重启" /data/park/logs/cam001_record.log -
如需停止脚本(正常维护):
bash# 查找进程ID并终止 ps -ef | grep camera_record.sh | grep -v grep | awk '{print $2}' | xargs kill -9
二、 增强功能 2:全局磁盘空间监控告警脚本
功能说明
- 监控园区录像存储目录所在磁盘,避免存储溢出导致录制失败
- 支持自定义告警阈值(默认 85%,磁盘使用率超过阈值触发告警)
- 提供 2 种告警方式(日志记录 + 邮件告警,可扩展至企业微信/钉钉)
- 可作为定时任务运行,定期巡检磁盘状态
- 自动识别目标目录所在磁盘分区,无需手动配置磁盘路径
告警脚本代码(保存为 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
脚本使用说明
-
赋予执行权限:
chmod +x disk_monitor_alert.sh -
手动测试运行:
./disk_monitor_alert.sh -
配置定时任务(每 30 分钟巡检一次,推荐):
bash# 编辑定时任务 crontab -e # 添加以下内容(每30分钟执行一次磁盘监控) */30 * * * * /data/park/scripts/disk_monitor_alert.sh -
启用邮件告警(可选):
- Ubuntu/Debian 安装邮件工具:
sudo apt install mailutils - CentOS 安装邮件工具:
sudo yum install mailx - 修改脚本中
ENABLE_EMAIL_ALERT=1,配置正确的ALERT_EMAIL
- Ubuntu/Debian 安装邮件工具:
-
查看告警日志:
grep "【告警】" /data/park/logs/disk_monitor.log
三、 增强功能 3:批量预处理/压缩脚本的「磁盘空间预检」
增强说明
在 batch_ai_preprocess.sh 和 history_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})
# ...(省略原有后续代码,保持不变)
改造说明
history_record_compress.sh可采用相同逻辑,在脚本开头添加磁盘预检- 预检目标目录为「输出目录」(预处理/压缩后的文件保存目录),更贴合实际场景
- 磁盘使用率超过阈值时,脚本直接退出并记录错误日志,不执行后续处理
四、 整体运维优化注意事项
-
重启日志排查 :若录制脚本高频重启,优先检查
RTSP_URL有效性、摄像头在线状态、园区网络稳定性 -
告警渠道扩展:可将邮件告警替换为企业微信/钉钉机器人告警,更适合园区运维团队实时接收通知
-
日志轮转 :配置
logrotate定期轮转监控日志,避免日志文件过大占用磁盘空间(示例配置):bash# 编辑 logrotate 配置文件 sudo vi /etc/logrotate.d/park_ffmpeg # 添加以下内容 /data/park/logs/*.log { daily rotate 30 compress missingok notifempty create 0644 root root } -
权限加固:脚本运行用户建议使用专用运维用户,避免 root 用户运行带来的安全风险
-
进程监控 :可配合
htop、nmon工具监控脚本运行时的 CPU/内存占用,避免影响服务器其他业务