实时手机检测-通用快速部署start.sh脚本原理与service.pid管理1. 引言你有没有遇到过这样的场景需要快速部署一个AI模型服务但每次都要手动敲一堆命令还得记住怎么启动、怎么停止、怎么查看状态。特别是当服务在后台运行时想确认它是否还在正常工作或者想安全地重启它总感觉有点麻烦。今天我们就来聊聊一个在AI模型部署中非常实用的小技巧——如何通过一个简单的启动脚本和进程ID文件来优雅地管理你的服务。我们以阿里巴巴的DAMO-YOLO手机检测模型为例这个模型在手机检测任务上表现相当不错准确率达到了88.8%推理速度也很快只要3.83毫秒。但再好的模型如果部署起来麻烦用起来也不顺手。所以这篇文章的重点不是教你模型原理而是教你如何让这个模型服务“听话”——用一行命令就能启动用一行命令就能停止还能随时知道它的运行状态。2. 项目结构与核心文件在深入讲解启动脚本之前我们先看看这个手机检测项目的整体结构。了解文件布局能帮你更好地理解各个部分是如何协同工作的。2.1 项目目录一览当你进入项目目录会看到这样的文件结构cv_tinynas_object-detection_damoyolo_phone/ ├── app.py # 这是服务的主程序基于Gradio的Web界面 ├── start.sh # 我们今天要重点分析的启动脚本 ├── requirements.txt # Python依赖包清单 ├── configuration.json # 模型的配置文件 ├── damoyolo.py # DAMO-YOLO网络结构的实现 ├── service.pid # 服务运行时的进程ID记录文件 ├── service.log # 服务的运行日志 └── assets/ └── demo/ # 存放示例图片的文件夹2.2 各文件的作用app.py- 这是整个服务的“大脑”。它基于Gradio框架构建了一个Web界面你上传图片它调用模型进行检测然后把结果展示给你看。代码量不大但把模型加载、图片处理、结果展示都串联起来了。requirements.txt- 相当于项目的“购物清单”。里面列出了运行这个服务需要的所有Python包和版本。当你在一个新环境部署时只需要执行pip install -r requirements.txt所有依赖就自动装好了。configuration.json- 模型的“使用说明书”。里面定义了模型的输入尺寸、检测阈值、非极大值抑制参数等。这些参数会影响检测的准确性和速度一般保持默认值就好除非你有特殊需求。damoyolo.py- 模型的“骨架”。这里实现了DAMO-YOLO的网络结构包括主干网络、颈部网络和检测头。对于大多数使用者来说不需要修改这个文件。start.sh- 服务的“开关”。这就是我们今天的主角一个Bash脚本封装了启动服务的所有细节。service.pid和service.log- 服务的“身份证”和“日记本”。前者记录服务进程的ID后者记录服务运行时的各种信息。3. start.sh脚本深度解析现在让我们打开start.sh脚本看看它到底做了什么。这个脚本虽然不长但每一行都有它的作用。3.1 脚本完整内容我们先看看完整的脚本内容#!/bin/bash # 实时手机检测服务启动脚本 # 作者CSDN星图镜像 # 版本1.0 # 设置工作目录 cd /root/cv_tinynas_object-detection_damoyolo_phone # 检查服务是否已经在运行 if [ -f service.pid ]; then PID$(cat service.pid) if ps -p $PID /dev/null 21; then echo 服务已在运行中 (PID: $PID) echo 如需重启请先执行: kill $(cat service.pid) exit 1 else echo 发现旧的PID文件但进程不存在清理中... rm -f service.pid fi fi # 清理可能存在的旧日志 if [ -f service.log ]; then echo 备份旧日志... mv service.log service.log.$(date %Y%m%d_%H%M%S) fi # 启动服务并记录PID echo 正在启动手机检测服务... nohup python3 app.py service.log 21 echo $! service.pid # 等待服务启动 sleep 3 # 检查服务是否启动成功 if ps -p $(cat service.pid) /dev/null 21; then echo 服务启动成功 echo 进程ID: $(cat service.pid) echo 日志文件: service.log echo echo 访问地址: http://localhost:7860 echo 如需停止服务: kill $(cat service.pid) else echo 服务启动失败请检查日志: service.log exit 1 fi3.2 逐行解读脚本逻辑第一行#!/bin/bash这是脚本的“身份证”告诉系统用Bash解释器来执行这个脚本。没有这一行系统就不知道该怎么运行它。工作目录设置cd /root/cv_tinynas_object-detection_damoyolo_phone这行代码确保脚本在正确的目录下执行。为什么这么重要因为后面的所有操作读取文件、写入日志都是基于当前目录的。如果不在项目目录脚本就找不到需要的文件。服务状态检查第10-22行这是脚本的“智能”所在。它先检查service.pid文件是否存在如果文件存在就读取里面的进程ID然后检查这个ID对应的进程是否还在运行如果正在运行就提示用户并退出避免启动多个相同服务如果进程不存在可能是上次异常退出就清理掉旧的PID文件这个检查很关键它能防止你无意中启动多个相同的服务占用多余的系统资源。日志处理第25-28行每次启动前脚本会把旧的日志文件重命名备份然后创建新的日志文件。这样做的优点是日志文件不会无限增大每次启动都有独立的日志方便排查问题保留了历史日志需要时可以查看备份的文件名包含时间戳比如service.log.20240215_143022一看就知道是什么时候的日志。服务启动第31-33行这是核心的启动命令分解来看nohup让服务在后台运行即使你关闭了终端窗口服务也不会停止python3 app.py运行Python服务程序 service.log 21把标准输出和错误输出都重定向到日志文件在后台运行echo $! service.pid$!是上一个后台进程的ID把它写入PID文件启动验证第36-48行启动后等待3秒然后检查进程是否真的在运行。如果运行成功就显示访问地址和停止命令如果失败就提示查看日志。4. service.pid文件的作用与管理你可能会有疑问为什么要专门用一个文件来记录进程ID直接记住不行吗其实这个小小的PID文件在服务管理中扮演着重要角色。4.1 PID文件的工作原理当Linux系统启动一个进程时会给它分配一个唯一的数字标识这就是进程IDPID。这个ID就像人的身份证号系统通过它来识别和管理进程。我们的启动脚本在服务启动后立即把进程ID写入了service.pid文件。这个文件通常只有一行内容就是那个数字ID。4.2 为什么需要PID文件1. 方便服务管理有了PID文件管理服务就变得很简单停止服务kill $(cat service.pid)查看状态ps -p $(cat service.pid)重启服务先停止再启动你不需要记住复杂的进程ID也不需要先用ps aux | grep查找进程。2. 防止重复启动就像我们前面看到的启动脚本会先检查PID文件。如果发现服务已经在运行就提示用户避免资源浪费。3. 自动化脚本的基础在自动化部署、监控脚本中PID文件是必不可少的。监控系统可以通过检查PID文件对应的进程是否存在来判断服务是否健康。4.3 实际使用示例让我们看看在实际操作中PID文件如何简化工作# 查看服务状态三种方式 # 方式1使用PID文件 ps -p $(cat service.pid) # 方式2查看进程列表 ps aux | grep python3 app.py # 方式3查看端口占用 netstat -tlnp | grep 7860 # 停止服务 kill $(cat service.pid) # 强制停止如果普通停止无效 kill -9 $(cat service.pid) # 查看服务日志 tail -f service.log # 实时查看最新日志 cat service.log # 查看完整日志 less service.log # 分页查看日志4.4 可能遇到的问题与解决问题1PID文件存在但进程不存在这种情况通常发生在服务异常崩溃时。解决方法很简单rm -f service.pid ./start.sh问题2想修改服务端口默认服务运行在7860端口如果这个端口被占用了你可以修改app.py中的端口设置然后重启服务。问题3服务启动失败首先查看日志文件通常会有错误信息tail -20 service.log # 查看最后20行日志常见的问题包括端口被占用、依赖包缺失、模型文件损坏等。5. 服务管理的最佳实践基于这个启动脚本我们可以建立一套完整的服务管理流程。这些实践不仅能用在手机检测服务上也适用于其他AI模型服务。5.1 完整的服务管理脚本你可以创建一个manage.sh脚本集成所有管理功能#!/bin/bash # 服务管理脚本 SERVICE_DIR/root/cv_tinynas_object-detection_damoyolo_phone PID_FILE$SERVICE_DIR/service.pid LOG_FILE$SERVICE_DIR/service.log case $1 in start) cd $SERVICE_DIR ./start.sh ;; stop) if [ -f $PID_FILE ]; then PID$(cat $PID_FILE) kill $PID 2/dev/null echo 服务已停止 rm -f $PID_FILE else echo 服务未运行 fi ;; restart) $0 stop sleep 2 $0 start ;; status) if [ -f $PID_FILE ]; then PID$(cat $PID_FILE) if ps -p $PID /dev/null 21; then echo 服务运行中 (PID: $PID) echo 运行时间: $(ps -o etime -p $PID) echo 内存占用: $(ps -o rss -p $PID) KB echo 访问地址: http://localhost:7860 else echo PID文件存在但进程不存在 fi else echo 服务未运行 fi ;; logs) tail -f $LOG_FILE ;; *) echo 使用方法: $0 {start|stop|restart|status|logs} exit 1 ;; esac使用这个脚本管理服务就更加方便了./manage.sh start # 启动 ./manage.sh stop # 停止 ./manage.sh restart # 重启 ./manage.sh status # 查看状态 ./manage.sh logs # 查看日志5.2 添加到系统启动可选如果你希望服务器重启后服务能自动启动可以创建一个systemd服务文件# 创建服务文件 sudo nano /etc/systemd/system/phone-detection.service文件内容[Unit] DescriptionPhone Detection Service Afternetwork.target [Service] Typesimple Userroot WorkingDirectory/root/cv_tinynas_object-detection_damoyolo_phone ExecStart/root/cv_tinynas_object-detection_damoyolo_phone/start.sh Restarton-failure RestartSec10 [Install] WantedBymulti-user.target然后启用服务sudo systemctl daemon-reload sudo systemctl enable phone-detection sudo systemctl start phone-detection5.3 监控与告警对于生产环境你还可以添加简单的监控# 监控脚本 monitor.sh #!/bin/bash SERVICE_DIR/root/cv_tinynas_object-detection_damoyolo_phone PID_FILE$SERVICE_DIR/service.pid LOG_FILE$SERVICE_DIR/service.log ALERT_EMAILadminexample.com # 检查服务状态 check_service() { if [ -f $PID_FILE ]; then PID$(cat $PID_FILE) if ! ps -p $PID /dev/null 21; then echo $(date): 服务异常停止正在重启... $LOG_FILE ./start.sh # 发送告警 echo 手机检测服务异常停止已自动重启 | mail -s 服务告警 $ALERT_EMAIL fi else echo $(date): 服务未运行正在启动... $LOG_FILE ./start.sh fi } # 检查资源使用 check_resources() { if [ -f $PID_FILE ]; then PID$(cat $PID_FILE) MEM_USAGE$(ps -o rss -p $PID) if [ $MEM_USAGE -gt 500000 ]; then # 如果内存超过500MB echo $(date): 内存使用过高: ${MEM_USAGE}KB $LOG_FILE fi fi } # 主循环 while true; do check_service check_resources sleep 60 # 每分钟检查一次 done6. 实际部署案例理论讲完了我们来看一个实际的部署案例看看从零开始到服务正常运行整个流程是怎样的。6.1 环境准备假设你有一台新的Linux服务器需要部署这个手机检测服务。以下是完整步骤# 1. 克隆项目如果已有镜像这步可能不需要 git clone 项目地址 cd cv_tinynas_object-detection_damoyolo_phone # 2. 安装Python依赖 pip install -r requirements.txt # 3. 测试直接运行 python3 app.py # 按CtrlC停止测试 # 4. 使用启动脚本 chmod x start.sh # 给脚本执行权限 ./start.sh # 5. 验证服务 curl http://localhost:7860 # 应该能看到Gradio界面 # 或者直接在浏览器访问 http://你的服务器IP:78606.2 性能测试服务启动后我们可以进行简单的性能测试# test_performance.py import time import requests import base64 from PIL import Image import io def test_api_speed(): # 读取测试图片 with open(assets/demo/test.jpg, rb) as f: image_data base64.b64encode(f.read()).decode() # 准备请求数据 payload { image: image_data } # 测试10次取平均时间 times [] for i in range(10): start_time time.time() response requests.post( http://localhost:7860/api/predict, jsonpayload ) end_time time.time() times.append(end_time - start_time) if response.status_code 200: print(f第{i1}次请求成功耗时: {(end_time-start_time)*1000:.2f}ms) else: print(f第{i1}次请求失败: {response.status_code}) print(f\n平均响应时间: {sum(times)/len(times)*1000:.2f}ms) print(f最快响应: {min(times)*1000:.2f}ms) print(f最慢响应: {max(times)*1000:.2f}ms) if __name__ __main__: test_api_speed()6.3 集成到其他系统这个服务不仅可以单独使用还可以集成到其他系统中。比如你可以创建一个简单的Flask应用调用这个检测服务# integration_example.py from flask import Flask, request, jsonify import requests import base64 app Flask(__name__) DETECTION_URL http://localhost:7860/api/predict app.route(/detect, methods[POST]) def detect_phone(): 接收图片调用检测服务返回结果 if image not in request.files: return jsonify({error: 没有上传图片}), 400 image_file request.files[image] # 将图片转为base64 image_data base64.b64encode(image_file.read()).decode() # 调用检测服务 try: response requests.post( DETECTION_URL, json{image: image_data}, timeout10 ) if response.status_code 200: return jsonify(response.json()) else: return jsonify({error: 检测服务异常}), 500 except requests.exceptions.RequestException as e: return jsonify({error: f连接检测服务失败: {str(e)}}), 500 app.route(/health) def health_check(): 健康检查接口 try: response requests.get(http://localhost:7860, timeout5) return jsonify({status: healthy if response.status_code 200 else unhealthy}) except: return jsonify({status: unhealthy}), 500 if __name__ __main__: app.run(host0.0.0.0, port5000)7. 总结通过这篇文章我们深入探讨了如何通过start.sh脚本和service.pid文件来管理AI模型服务。这套方法虽然简单但非常实用能显著提升服务部署和维护的效率。7.1 关键要点回顾启动脚本的价值start.sh脚本不仅仅是一个启动命令的封装它包含了服务状态检查、日志管理、进程监控等完整逻辑让服务启动更加可靠。PID文件的作用service.pid文件是服务管理的核心它记录了进程ID使得停止、重启、监控服务变得非常简单。错误处理机制好的脚本应该能处理各种异常情况比如服务已运行、进程异常退出、端口冲突等。扩展性基于这个基础框架你可以添加更多功能比如自动重启、资源监控、告警通知等。7.2 实际应用建议在实际项目中你可以根据需求调整这个启动脚本多环境支持添加参数支持不同环境开发、测试、生产配置管理从配置文件读取端口、日志路径等参数健康检查启动后自动进行健康检查确保服务真正可用版本管理在日志中记录服务版本和启动时间7.3 最后的小技巧如果你经常需要部署不同的AI模型服务可以考虑创建一个通用的启动脚本模板#!/bin/bash # 通用服务启动脚本模板 SERVICE_NAME$1 SCRIPT_NAME$2 LOG_FILElogs/${SERVICE_NAME}.log PID_FILEpids/${SERVICE_NAME}.pid # 创建必要的目录 mkdir -p logs pids # 统一的启动逻辑 start_service() { # 检查是否已运行 # 备份日志 # 启动服务 # 记录PID # 验证启动 } # 根据参数调用不同函数 case $1 in start) start_service ;; stop) stop_service ;; # ... 其他命令 esac这样无论部署什么模型都可以使用同一套管理流程大大提高了效率。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
实时手机检测-通用快速部署:start.sh脚本原理与service.pid管理
实时手机检测-通用快速部署start.sh脚本原理与service.pid管理1. 引言你有没有遇到过这样的场景需要快速部署一个AI模型服务但每次都要手动敲一堆命令还得记住怎么启动、怎么停止、怎么查看状态。特别是当服务在后台运行时想确认它是否还在正常工作或者想安全地重启它总感觉有点麻烦。今天我们就来聊聊一个在AI模型部署中非常实用的小技巧——如何通过一个简单的启动脚本和进程ID文件来优雅地管理你的服务。我们以阿里巴巴的DAMO-YOLO手机检测模型为例这个模型在手机检测任务上表现相当不错准确率达到了88.8%推理速度也很快只要3.83毫秒。但再好的模型如果部署起来麻烦用起来也不顺手。所以这篇文章的重点不是教你模型原理而是教你如何让这个模型服务“听话”——用一行命令就能启动用一行命令就能停止还能随时知道它的运行状态。2. 项目结构与核心文件在深入讲解启动脚本之前我们先看看这个手机检测项目的整体结构。了解文件布局能帮你更好地理解各个部分是如何协同工作的。2.1 项目目录一览当你进入项目目录会看到这样的文件结构cv_tinynas_object-detection_damoyolo_phone/ ├── app.py # 这是服务的主程序基于Gradio的Web界面 ├── start.sh # 我们今天要重点分析的启动脚本 ├── requirements.txt # Python依赖包清单 ├── configuration.json # 模型的配置文件 ├── damoyolo.py # DAMO-YOLO网络结构的实现 ├── service.pid # 服务运行时的进程ID记录文件 ├── service.log # 服务的运行日志 └── assets/ └── demo/ # 存放示例图片的文件夹2.2 各文件的作用app.py- 这是整个服务的“大脑”。它基于Gradio框架构建了一个Web界面你上传图片它调用模型进行检测然后把结果展示给你看。代码量不大但把模型加载、图片处理、结果展示都串联起来了。requirements.txt- 相当于项目的“购物清单”。里面列出了运行这个服务需要的所有Python包和版本。当你在一个新环境部署时只需要执行pip install -r requirements.txt所有依赖就自动装好了。configuration.json- 模型的“使用说明书”。里面定义了模型的输入尺寸、检测阈值、非极大值抑制参数等。这些参数会影响检测的准确性和速度一般保持默认值就好除非你有特殊需求。damoyolo.py- 模型的“骨架”。这里实现了DAMO-YOLO的网络结构包括主干网络、颈部网络和检测头。对于大多数使用者来说不需要修改这个文件。start.sh- 服务的“开关”。这就是我们今天的主角一个Bash脚本封装了启动服务的所有细节。service.pid和service.log- 服务的“身份证”和“日记本”。前者记录服务进程的ID后者记录服务运行时的各种信息。3. start.sh脚本深度解析现在让我们打开start.sh脚本看看它到底做了什么。这个脚本虽然不长但每一行都有它的作用。3.1 脚本完整内容我们先看看完整的脚本内容#!/bin/bash # 实时手机检测服务启动脚本 # 作者CSDN星图镜像 # 版本1.0 # 设置工作目录 cd /root/cv_tinynas_object-detection_damoyolo_phone # 检查服务是否已经在运行 if [ -f service.pid ]; then PID$(cat service.pid) if ps -p $PID /dev/null 21; then echo 服务已在运行中 (PID: $PID) echo 如需重启请先执行: kill $(cat service.pid) exit 1 else echo 发现旧的PID文件但进程不存在清理中... rm -f service.pid fi fi # 清理可能存在的旧日志 if [ -f service.log ]; then echo 备份旧日志... mv service.log service.log.$(date %Y%m%d_%H%M%S) fi # 启动服务并记录PID echo 正在启动手机检测服务... nohup python3 app.py service.log 21 echo $! service.pid # 等待服务启动 sleep 3 # 检查服务是否启动成功 if ps -p $(cat service.pid) /dev/null 21; then echo 服务启动成功 echo 进程ID: $(cat service.pid) echo 日志文件: service.log echo echo 访问地址: http://localhost:7860 echo 如需停止服务: kill $(cat service.pid) else echo 服务启动失败请检查日志: service.log exit 1 fi3.2 逐行解读脚本逻辑第一行#!/bin/bash这是脚本的“身份证”告诉系统用Bash解释器来执行这个脚本。没有这一行系统就不知道该怎么运行它。工作目录设置cd /root/cv_tinynas_object-detection_damoyolo_phone这行代码确保脚本在正确的目录下执行。为什么这么重要因为后面的所有操作读取文件、写入日志都是基于当前目录的。如果不在项目目录脚本就找不到需要的文件。服务状态检查第10-22行这是脚本的“智能”所在。它先检查service.pid文件是否存在如果文件存在就读取里面的进程ID然后检查这个ID对应的进程是否还在运行如果正在运行就提示用户并退出避免启动多个相同服务如果进程不存在可能是上次异常退出就清理掉旧的PID文件这个检查很关键它能防止你无意中启动多个相同的服务占用多余的系统资源。日志处理第25-28行每次启动前脚本会把旧的日志文件重命名备份然后创建新的日志文件。这样做的优点是日志文件不会无限增大每次启动都有独立的日志方便排查问题保留了历史日志需要时可以查看备份的文件名包含时间戳比如service.log.20240215_143022一看就知道是什么时候的日志。服务启动第31-33行这是核心的启动命令分解来看nohup让服务在后台运行即使你关闭了终端窗口服务也不会停止python3 app.py运行Python服务程序 service.log 21把标准输出和错误输出都重定向到日志文件在后台运行echo $! service.pid$!是上一个后台进程的ID把它写入PID文件启动验证第36-48行启动后等待3秒然后检查进程是否真的在运行。如果运行成功就显示访问地址和停止命令如果失败就提示查看日志。4. service.pid文件的作用与管理你可能会有疑问为什么要专门用一个文件来记录进程ID直接记住不行吗其实这个小小的PID文件在服务管理中扮演着重要角色。4.1 PID文件的工作原理当Linux系统启动一个进程时会给它分配一个唯一的数字标识这就是进程IDPID。这个ID就像人的身份证号系统通过它来识别和管理进程。我们的启动脚本在服务启动后立即把进程ID写入了service.pid文件。这个文件通常只有一行内容就是那个数字ID。4.2 为什么需要PID文件1. 方便服务管理有了PID文件管理服务就变得很简单停止服务kill $(cat service.pid)查看状态ps -p $(cat service.pid)重启服务先停止再启动你不需要记住复杂的进程ID也不需要先用ps aux | grep查找进程。2. 防止重复启动就像我们前面看到的启动脚本会先检查PID文件。如果发现服务已经在运行就提示用户避免资源浪费。3. 自动化脚本的基础在自动化部署、监控脚本中PID文件是必不可少的。监控系统可以通过检查PID文件对应的进程是否存在来判断服务是否健康。4.3 实际使用示例让我们看看在实际操作中PID文件如何简化工作# 查看服务状态三种方式 # 方式1使用PID文件 ps -p $(cat service.pid) # 方式2查看进程列表 ps aux | grep python3 app.py # 方式3查看端口占用 netstat -tlnp | grep 7860 # 停止服务 kill $(cat service.pid) # 强制停止如果普通停止无效 kill -9 $(cat service.pid) # 查看服务日志 tail -f service.log # 实时查看最新日志 cat service.log # 查看完整日志 less service.log # 分页查看日志4.4 可能遇到的问题与解决问题1PID文件存在但进程不存在这种情况通常发生在服务异常崩溃时。解决方法很简单rm -f service.pid ./start.sh问题2想修改服务端口默认服务运行在7860端口如果这个端口被占用了你可以修改app.py中的端口设置然后重启服务。问题3服务启动失败首先查看日志文件通常会有错误信息tail -20 service.log # 查看最后20行日志常见的问题包括端口被占用、依赖包缺失、模型文件损坏等。5. 服务管理的最佳实践基于这个启动脚本我们可以建立一套完整的服务管理流程。这些实践不仅能用在手机检测服务上也适用于其他AI模型服务。5.1 完整的服务管理脚本你可以创建一个manage.sh脚本集成所有管理功能#!/bin/bash # 服务管理脚本 SERVICE_DIR/root/cv_tinynas_object-detection_damoyolo_phone PID_FILE$SERVICE_DIR/service.pid LOG_FILE$SERVICE_DIR/service.log case $1 in start) cd $SERVICE_DIR ./start.sh ;; stop) if [ -f $PID_FILE ]; then PID$(cat $PID_FILE) kill $PID 2/dev/null echo 服务已停止 rm -f $PID_FILE else echo 服务未运行 fi ;; restart) $0 stop sleep 2 $0 start ;; status) if [ -f $PID_FILE ]; then PID$(cat $PID_FILE) if ps -p $PID /dev/null 21; then echo 服务运行中 (PID: $PID) echo 运行时间: $(ps -o etime -p $PID) echo 内存占用: $(ps -o rss -p $PID) KB echo 访问地址: http://localhost:7860 else echo PID文件存在但进程不存在 fi else echo 服务未运行 fi ;; logs) tail -f $LOG_FILE ;; *) echo 使用方法: $0 {start|stop|restart|status|logs} exit 1 ;; esac使用这个脚本管理服务就更加方便了./manage.sh start # 启动 ./manage.sh stop # 停止 ./manage.sh restart # 重启 ./manage.sh status # 查看状态 ./manage.sh logs # 查看日志5.2 添加到系统启动可选如果你希望服务器重启后服务能自动启动可以创建一个systemd服务文件# 创建服务文件 sudo nano /etc/systemd/system/phone-detection.service文件内容[Unit] DescriptionPhone Detection Service Afternetwork.target [Service] Typesimple Userroot WorkingDirectory/root/cv_tinynas_object-detection_damoyolo_phone ExecStart/root/cv_tinynas_object-detection_damoyolo_phone/start.sh Restarton-failure RestartSec10 [Install] WantedBymulti-user.target然后启用服务sudo systemctl daemon-reload sudo systemctl enable phone-detection sudo systemctl start phone-detection5.3 监控与告警对于生产环境你还可以添加简单的监控# 监控脚本 monitor.sh #!/bin/bash SERVICE_DIR/root/cv_tinynas_object-detection_damoyolo_phone PID_FILE$SERVICE_DIR/service.pid LOG_FILE$SERVICE_DIR/service.log ALERT_EMAILadminexample.com # 检查服务状态 check_service() { if [ -f $PID_FILE ]; then PID$(cat $PID_FILE) if ! ps -p $PID /dev/null 21; then echo $(date): 服务异常停止正在重启... $LOG_FILE ./start.sh # 发送告警 echo 手机检测服务异常停止已自动重启 | mail -s 服务告警 $ALERT_EMAIL fi else echo $(date): 服务未运行正在启动... $LOG_FILE ./start.sh fi } # 检查资源使用 check_resources() { if [ -f $PID_FILE ]; then PID$(cat $PID_FILE) MEM_USAGE$(ps -o rss -p $PID) if [ $MEM_USAGE -gt 500000 ]; then # 如果内存超过500MB echo $(date): 内存使用过高: ${MEM_USAGE}KB $LOG_FILE fi fi } # 主循环 while true; do check_service check_resources sleep 60 # 每分钟检查一次 done6. 实际部署案例理论讲完了我们来看一个实际的部署案例看看从零开始到服务正常运行整个流程是怎样的。6.1 环境准备假设你有一台新的Linux服务器需要部署这个手机检测服务。以下是完整步骤# 1. 克隆项目如果已有镜像这步可能不需要 git clone 项目地址 cd cv_tinynas_object-detection_damoyolo_phone # 2. 安装Python依赖 pip install -r requirements.txt # 3. 测试直接运行 python3 app.py # 按CtrlC停止测试 # 4. 使用启动脚本 chmod x start.sh # 给脚本执行权限 ./start.sh # 5. 验证服务 curl http://localhost:7860 # 应该能看到Gradio界面 # 或者直接在浏览器访问 http://你的服务器IP:78606.2 性能测试服务启动后我们可以进行简单的性能测试# test_performance.py import time import requests import base64 from PIL import Image import io def test_api_speed(): # 读取测试图片 with open(assets/demo/test.jpg, rb) as f: image_data base64.b64encode(f.read()).decode() # 准备请求数据 payload { image: image_data } # 测试10次取平均时间 times [] for i in range(10): start_time time.time() response requests.post( http://localhost:7860/api/predict, jsonpayload ) end_time time.time() times.append(end_time - start_time) if response.status_code 200: print(f第{i1}次请求成功耗时: {(end_time-start_time)*1000:.2f}ms) else: print(f第{i1}次请求失败: {response.status_code}) print(f\n平均响应时间: {sum(times)/len(times)*1000:.2f}ms) print(f最快响应: {min(times)*1000:.2f}ms) print(f最慢响应: {max(times)*1000:.2f}ms) if __name__ __main__: test_api_speed()6.3 集成到其他系统这个服务不仅可以单独使用还可以集成到其他系统中。比如你可以创建一个简单的Flask应用调用这个检测服务# integration_example.py from flask import Flask, request, jsonify import requests import base64 app Flask(__name__) DETECTION_URL http://localhost:7860/api/predict app.route(/detect, methods[POST]) def detect_phone(): 接收图片调用检测服务返回结果 if image not in request.files: return jsonify({error: 没有上传图片}), 400 image_file request.files[image] # 将图片转为base64 image_data base64.b64encode(image_file.read()).decode() # 调用检测服务 try: response requests.post( DETECTION_URL, json{image: image_data}, timeout10 ) if response.status_code 200: return jsonify(response.json()) else: return jsonify({error: 检测服务异常}), 500 except requests.exceptions.RequestException as e: return jsonify({error: f连接检测服务失败: {str(e)}}), 500 app.route(/health) def health_check(): 健康检查接口 try: response requests.get(http://localhost:7860, timeout5) return jsonify({status: healthy if response.status_code 200 else unhealthy}) except: return jsonify({status: unhealthy}), 500 if __name__ __main__: app.run(host0.0.0.0, port5000)7. 总结通过这篇文章我们深入探讨了如何通过start.sh脚本和service.pid文件来管理AI模型服务。这套方法虽然简单但非常实用能显著提升服务部署和维护的效率。7.1 关键要点回顾启动脚本的价值start.sh脚本不仅仅是一个启动命令的封装它包含了服务状态检查、日志管理、进程监控等完整逻辑让服务启动更加可靠。PID文件的作用service.pid文件是服务管理的核心它记录了进程ID使得停止、重启、监控服务变得非常简单。错误处理机制好的脚本应该能处理各种异常情况比如服务已运行、进程异常退出、端口冲突等。扩展性基于这个基础框架你可以添加更多功能比如自动重启、资源监控、告警通知等。7.2 实际应用建议在实际项目中你可以根据需求调整这个启动脚本多环境支持添加参数支持不同环境开发、测试、生产配置管理从配置文件读取端口、日志路径等参数健康检查启动后自动进行健康检查确保服务真正可用版本管理在日志中记录服务版本和启动时间7.3 最后的小技巧如果你经常需要部署不同的AI模型服务可以考虑创建一个通用的启动脚本模板#!/bin/bash # 通用服务启动脚本模板 SERVICE_NAME$1 SCRIPT_NAME$2 LOG_FILElogs/${SERVICE_NAME}.log PID_FILEpids/${SERVICE_NAME}.pid # 创建必要的目录 mkdir -p logs pids # 统一的启动逻辑 start_service() { # 检查是否已运行 # 备份日志 # 启动服务 # 记录PID # 验证启动 } # 根据参数调用不同函数 case $1 in start) start_service ;; stop) stop_service ;; # ... 其他命令 esac这样无论部署什么模型都可以使用同一套管理流程大大提高了效率。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。