运行脚本指南.md 6 KB

run.sh 运行脚本使用指南

概述

run.sh 是一个自动化运行脚本,集成了内存监控功能,确保离线任务安全高效运行。

主要特性

1. 内存监控

  • 警告阈值: 25GB - 打印警告日志
  • 强制终止阈值: 30GB - 自动kill进程
  • 检查频率: 每10秒检查一次
  • 日志文件: logs/memory_monitor.log

2. 任务流程

  1. 清理旧进程和输出
  2. 运行调试模式(小数据量测试)
  3. 运行生产模式(大数据量)
  4. 加载索引到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

故障排查

内存持续超限

原因:

  • 数据量太大
  • 内存泄漏
  • 并发任务过多

解决方案:

  1. 增加内存阈值(临时方案)
  2. 优化代码减少内存占用
  3. 分批处理数据
  4. 使用增量更新

进程被意外终止

检查日志:

# 查看监控日志
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

性能优化

内存优化建议

  1. 分批处理

    # 在代码中使用batch处理
    batch_size = 1000
    for i in range(0, len(items), batch_size):
       batch = items[i:i+batch_size]
       process(batch)
    
  2. 及时释放

    import gc
    del large_object
    gc.collect()
    
  3. 使用生成器

    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 {} \;

安全注意事项

  1. 权限: 确保脚本有执行权限 chmod +x run.sh
  2. 路径: 使用绝对路径避免混淆
  3. 清理: 脚本会清理旧进程,确保没有重要进程被误杀
  4. 备份: 脚本会删除output目录,请提前备份重要数据

总结

run.sh 提供了:

  • ✅ 自动化运行流程
  • ✅ 内存监控保护
  • ✅ 详细日志记录
  • ✅ 错误处理机制
  • ✅ 进度显示

建议在生产环境使用前先在测试环境验证。


更新时间: 2025-10-17
版本: v2.0