start.sh与stop.sh脚本详解:DAMO-YOLO手机检测服务自动化管理
1. 项目概述
今天我们来深入解析一个实用工具——基于DAMO-YOLO的手机检测服务的自动化管理脚本。如果你正在使用这个实时手机检测系统,那么start.sh和stop.sh就是你最得力的助手。
这个系统采用了阿里巴巴达摩院开发的DAMO-YOLO模型,结合TinyNAS技术,专门为手机端低算力、低功耗场景优化。简单来说就是:小、快、省——模型体积小、检测速度快、资源消耗省。
1.1 为什么需要自动化脚本?
想象一下,每次启动服务都要手动输入一堆命令,停止服务又要一个个关闭进程,既麻烦又容易出错。start.sh和stop.sh脚本就是为了解决这个问题而生的:
- 一键启动:复杂的环境准备和服务启动流程自动化
- 一键停止:安全地关闭所有相关进程,避免资源残留
- 状态管理:实时监控服务运行状态,出现问题及时处理
- 日志记录:详细记录运行日志,方便排查问题
2. 脚本功能详解
2.1 start.sh启动脚本解析
start.sh脚本是整个服务的启动引擎,它负责完成以下关键任务:
#!/bin/bash # 设置环境变量 export PYTHONPATH=/root/phone-detection:$PYTHONPATH export MODEL_PATH=/root/phone-detection/models/damo-yolo-s # 检查依赖是否安装 if ! pip show modelscope > /dev/null 2>&1; then echo "安装缺失依赖..." pip install -r /root/phone-detection/requirements.txt fi # 创建日志目录 mkdir -p /root/phone-detection/logs # 启动服务 cd /root/phone-detection nohup python app.py --port 7860 --host 0.0.0.0 > logs/access.log 2> logs/error.log & # 记录进程ID echo $! > /tmp/phone-detection.pid echo "服务启动成功!进程ID: $!" echo "访问地址: http://服务器IP:7860"脚本核心功能说明:
- 环境准备:设置Python路径和模型路径,确保程序能找到所有需要的文件
- 依赖检查:自动检查并安装缺失的Python包,避免因依赖问题导致启动失败
- 日志管理:创建日志目录,确保日志文件有地方存储
- 服务启动:使用nohup在后台启动服务,并将输出重定向到日志文件
- 进程管理:保存进程ID到临时文件,方便后续管理
2.2 stop.sh停止脚本解析
stop.sh脚本负责安全地停止服务,确保不会留下僵尸进程或资源泄漏:
#!/bin/bash # 检查进程文件是否存在 if [ ! -f /tmp/phone-detection.pid ]; then echo "未找到进程文件,服务可能未启动" exit 1 fi # 读取进程ID PID=$(cat /tmp/phone-detection.pid) # 检查进程是否在运行 if ps -p $PID > /dev/null 2>&1; then echo "正在停止服务 (进程ID: $PID)..." kill -TERM $PID # 等待进程结束 sleep 3 # 检查是否成功停止 if ps -p $PID > /dev/null 2>&1; then echo "正常停止失败,尝试强制停止..." kill -KILL $PID fi # 清理进程文件 rm -f /tmp/phone-detection.pid echo "服务已停止" else echo "进程 $PID 未运行,清理残留文件" rm -f /tmp/phone-detection.pid fi # 额外清理可能存在的残留进程 pkill -f "python app.py" 2>/dev/null安全停止机制:
- 优雅停止:首先发送TERM信号,让程序有机会完成当前处理并清理资源
- 强制停止:如果优雅停止失败,使用KILL信号强制终止
- 彻底清理:清理进程文件,并额外检查是否有残留进程
- 状态验证:每一步都验证操作结果,确保真正停止成功
3. 实际使用指南
3.1 脚本使用方法
启动服务:
# 进入脚本目录 cd /root/phone-detection # 添加执行权限(首次使用需要) chmod +x start.sh stop.sh # 启动服务 ./start.sh停止服务:
# 停止服务 ./stop.sh # 查看停止状态 echo $? # 返回0表示成功,非0表示失败检查服务状态:
# 检查进程是否在运行 ps aux | grep "python app.py" # 查看服务日志 tail -f /root/phone-detection/logs/access.log3.2 自动化部署示例
在实际生产环境中,你可能会需要更复杂的自动化管理。这里提供一个增强版的启动脚本示例:
#!/bin/bash # 增强版启动脚本 CONFIG_FILE="/root/phone-detection/config.ini" LOG_DIR="/root/phone-detection/logs" TIMESTAMP=$(date +%Y%m%d_%H%M%S) # 加载配置 if [ -f "$CONFIG_FILE" ]; then source "$CONFIG_FILE" else PORT=7860 HOST="0.0.0.0" WORKERS=2 fi # 检查端口是否被占用 if netstat -tln | grep :$PORT > /dev/null; then echo "端口 $PORT 已被占用,尝试停止现有服务..." ./stop.sh sleep 2 fi # 启动服务并记录详细日志 echo "启动时间: $(date)" >> "$LOG_DIR/start_$TIMESTAMP.log" nohup python app.py --port $PORT --host $HOST --workers $WORKERS >> "$LOG_DIR/access.log" 2>> "$LOG_DIR/error.log" & echo $! > /tmp/phone-detection.pid echo "服务启动完成,进程ID: $!"4. 常见问题与解决方案
4.1 启动失败排查
问题:执行start.sh后服务立即退出
# 查看详细错误信息 cd /root/phone-detection python app.py --port 7860 --host 0.0.0.0 # 检查依赖是否完整 pip check -r requirements.txt # 检查端口冲突 netstat -tlnp | grep 7860解决方案:
- 检查Python版本是否为3.11+
- 确认所有依赖包已正确安装
- 检查7860端口是否被其他程序占用
4.2 停止脚本问题
问题:stop.sh无法正常停止服务
# 手动停止服务 ps aux | grep "python app.py" | grep -v grep | awk '{print $2}' | xargs kill -TERM # 清理残留进程 pkill -f "gradio" # 停止Gradio相关进程 pkill -f "python.*app.py" # 停止Python进程4.3 权限问题处理
问题:脚本没有执行权限
# 添加执行权限 chmod +x /root/phone-detection/start.sh chmod +x /root/phone-detection/stop.sh # 检查脚本格式 cat -A start.sh # 应该以#!/bin/bash开头 # 如果从Windows传输,需要转换行尾符 sed -i 's/\r$//' start.sh # 删除Windows换行符5. 高级使用技巧
5.1 自定义配置
创建配置文件config.ini来管理不同环境的设置:
# 开发环境配置 [development] PORT=7860 HOST=0.0.0.0 WORKERS=1 LOG_LEVEL=DEBUG # 生产环境配置 [production] PORT=7860 HOST=0.0.0.0 WORKERS=4 LOG_LEVEL=INFO MODEL_PATH=/models/damo-yolo-s5.2 日志轮转设置
为了避免日志文件无限增长,可以设置日志轮转:
# 在start.sh中添加日志轮转 LOG_FILE="/root/phone-detection/logs/access.log" if [ -f "$LOG_FILE" ] && [ $(wc -c < "$LOG_FILE") -gt 10000000 ]; then mv "$LOG_FILE" "$LOG_FILE.old" touch "$LOG_FILE" fi5.3 服务监控脚本
创建监控脚本定期检查服务状态:
#!/bin/bash # monitor.sh - 服务监控脚本 SERVICE_PID=$(cat /tmp/phone-detection.pid 2>/dev/null) if [ -z "$SERVICE_PID" ] || ! ps -p "$SERVICE_PID" > /dev/null 2>&1; then echo "服务未运行,尝试重新启动..." ./start.sh # 发送通知 echo "手机检测服务已重启于 $(date)" | mail -s "服务重启通知" admin@example.com fi6. 总结
通过本文的详细解析,你应该已经对DAMO-YOLO手机检测服务的start.sh和stop.sh脚本有了全面的了解。这两个脚本虽然看起来简单,但却是服务稳定运行的重要保障。
关键要点回顾:
- 自动化管理:脚本实现了服务的全生命周期管理,从启动到停止都无需人工干预
- 错误处理:完善的错误检测和处理机制,确保各种异常情况都能妥善处理
- 资源管理:正确的进程管理和资源清理,避免内存泄漏和资源浪费
- 可扩展性:脚本设计考虑了扩展性,可以方便地添加新功能
最佳实践建议:
- 定期检查脚本是否具有执行权限
- 监控日志文件大小,避免磁盘空间不足
- 在生产环境中使用配置管理,区分不同环境设置
- 设置定时任务监控服务状态,确保高可用性
现在你已经掌握了这些脚本的使用方法和原理,可以更加自信地管理你的手机检测服务了。如果在使用过程中遇到任何问题,记得查看日志文件,里面通常包含了解决问题的关键信息。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。