运行脚本指南.md
6 KB
run.sh 运行脚本使用指南
概述
run.sh 是一个自动化运行脚本,集成了内存监控功能,确保离线任务安全高效运行。
主要特性
1. 内存监控
- 警告阈值: 25GB - 打印警告日志
- 强制终止阈值: 30GB - 自动kill进程
- 检查频率: 每10秒检查一次
- 日志文件:
logs/memory_monitor.log
2. 任务流程
- 清理旧进程和输出
- 运行调试模式(小数据量测试)
- 运行生产模式(大数据量)
- 加载索引到Redis
3. 错误处理
- 任何步骤失败会立即退出
- 显示详细的退出码
- 保存完整日志
使用方法
基本运行
cd /home/tw/recommendation/offline_tasks
./run.sh
查看实时输出
./run.sh | tee logs/run_$(date +%Y%m%d_%H%M%S).log
后台运行
nohup ./run.sh > logs/run_$(date +%Y%m%d_%H%M%S).log 2>&1 &
内存监控说明
监控逻辑
check_memory() {
local pid=$1
local threshold_warn=25 # 25GB警告
local threshold_kill=30 # 30GB强制kill
while 进程运行中; do
获取内存使用
if 内存 >= 30GB:
打印错误日志
强制终止进程
break
elif 内存 >= 25GB:
打印警告日志
sleep 10秒
done
}
日志格式
警告日志:
[2025-10-17 14:30:25] ⚠️ 内存警告!当前使用: 26.45GB (>= 25GB), PID=12345
强制终止日志:
[2025-10-17 14:35:30] ❌ 内存超限!当前使用: 31.20GB (>= 30GB), 强制终止进程 PID=12345
查看监控日志
# 实时查看
tail -f logs/memory_monitor.log
# 查看历史
cat logs/memory_monitor.log
运行流程
步骤1: 调试模式
python3 run_all.py --debug
- 使用默认参数(见
offline_config.py) - 输出保存到
output_debug/ - 启动内存监控
步骤2: 生产模式
python3 run_all.py --debug
- 生成完整索引
- 输出保存到
output/ - 启动内存监控
步骤3: 加载Redis
python3 scripts/load_index_to_redis.py --redis-host localhost
- 加载所有生成的索引
- 包括新增的内容相似索引
输出示例
======================================================================
开始运行离线任务 - 2025-10-17 14:00:00
内存监控: 警告阈值=25GB, 强制终止阈值=30GB
======================================================================
>>> 步骤1: 调试模式运行(小数据量)
调试任务 PID: 12345
✓ 调试模式完成
>>> 步骤2: 生产模式运行(大数据量)
生产任务 PID: 12346
[2025-10-17 14:30:25] ⚠️ 内存警告!当前使用: 26.45GB (>= 25GB), PID=12346
✓ 生产模式完成
>>> 步骤3: 加载到Redis
✓ Redis加载完成
======================================================================
所有任务完成 - 2025-10-17 16:30:00
======================================================================
自定义配置
修改内存阈值
编辑 run.sh 中的以下行:
local threshold_warn=25 # 修改警告阈值
local threshold_kill=30 # 修改强制kill阈值
修改检查频率
编辑 run.sh 中的以下行:
sleep 10 # 修改为其他秒数
跳过调试模式
注释掉步骤1相关代码:
# # 3. 调试模式运行(小数据量)
# echo ""
# echo ">>> 步骤1: 调试模式运行(小数据量)"
# python3 run_all.py --debug &
# ...
修改Redis配置
修改步骤3的参数:
python3 scripts/load_index_to_redis.py \
--redis-host your-redis-host \
--redis-port 6379 \
--redis-db 0
故障排查
内存持续超限
原因:
- 数据量太大
- 内存泄漏
- 并发任务过多
解决方案:
- 增加内存阈值(临时方案)
- 优化代码减少内存占用
- 分批处理数据
- 使用增量更新
进程被意外终止
检查日志:
# 查看监控日志
cat logs/memory_monitor.log
# 查看任务日志
ls -lht logs/
cat logs/run_all_*.log
任务失败
查看退出码:
- 0: 成功
- 1: 一般错误
- 137: 被kill信号终止(可能是内存超限)
- 其他: 查看具体错误信息
监控建议
1. 添加系统监控
# 安装监控工具
apt install htop iotop
# 实时监控
htop -p $(pgrep -f run_all.py)
2. 设置告警
# 配置邮件告警
if [ $PROD_EXIT_CODE -ne 0 ]; then
echo "任务失败" | mail -s "离线任务告警" admin@example.com
fi
3. 定时任务
# 添加到crontab
0 2 * * * /home/tw/recommendation/offline_tasks/run.sh >> /var/log/offline_tasks.log 2>&1
性能优化
内存优化建议
分批处理
# 在代码中使用batch处理 batch_size = 1000 for i in range(0, len(items), batch_size): batch = items[i:i+batch_size] process(batch)及时释放
import gc del large_object gc.collect()使用生成器
def process_items(): for item in items: yield process(item)
日志管理
日志文件
logs/memory_monitor.log- 内存监控日志logs/run_all_YYYYMMDD.log- 任务运行日志output/- 生成的索引文件output_debug/- 调试模式输出
清理旧日志
# 保留最近7天
find logs/ -name "*.log" -mtime +7 -delete
# 压缩旧日志
find logs/ -name "*.log" -mtime +3 -exec gzip {} \;
安全注意事项
- 权限: 确保脚本有执行权限
chmod +x run.sh - 路径: 使用绝对路径避免混淆
- 清理: 脚本会清理旧进程,确保没有重要进程被误杀
- 备份: 脚本会删除output目录,请提前备份重要数据
总结
run.sh 提供了:
- ✅ 自动化运行流程
- ✅ 内存监控保护
- ✅ 详细日志记录
- ✅ 错误处理机制
- ✅ 进度显示
建议在生产环境使用前先在测试环境验证。
更新时间: 2025-10-17
版本: v2.0