02 --- Linux 开发必备技能
作者:智汇嵌入式实验室 · 7yewh
本文件是 Jetson YOLO 部署系列的第 2 篇。
目标:掌握部署过程中真正用得到的 Linux 技能,不贪多,只求实战够用。
1. Shell 脚本基础
部署时经常需要写脚本来自动化流程:启动推理、批量转换模型、定时录制等。
1.1 最小可用脚本
bash
#!/bin/bash
# 文件名:run_inference.sh
# 功能:启动 YOLO 推理
echo "==============================="
echo " 启动 YOLO 推理"
echo "==============================="
# 激活虚拟环境
source ~/envs/yolo/bin/activate
# 运行推理
python3 detect.py --weights yolov8n.pt --source 0 --device 0
echo "推理结束"
bash
# 给脚本执行权限
chmod +x run_inference.sh
# 运行
./run_inference.sh
1.2 变量与参数
bash
#!/bin/bash
# 变量定义(等号两边不能有空格!)
MODEL="yolov8n.pt"
INPUT="./test_images/"
DEVICE=0
CONF=0.5
# 使用变量
python3 detect.py \
--weights $MODEL \
--source $INPUT \
--device $DEVICE \
--conf $CONF
# 命令行参数
# $1 是第一个参数,$2 是第二个,$# 是参数总数
# 用法:./run.sh yolov8s.pt 0.7
MODEL=${1:-"yolov8n.pt"} # 如果没传参数,用默认值
CONF=${2:-0.5}
1.3 条件判断
bash
#!/bin/bash
# 检查文件是否存在
if [ -f "model.onnx" ]; then
echo "模型文件存在,开始转换"
python3 convert.py
else
echo "错误:model.onnx 不存在!"
exit 1
fi
# 检查 GPU 是否可用
if nvidia-smi > /dev/null 2>&1; then
echo "检测到 NVIDIA GPU"
DEVICE=0
else
echo "未检测到 GPU,使用 CPU"
DEVICE="cpu"
fi
# 检查目录是否存在,不存在则创建
[ -d "./output" ] || mkdir -p ./output
1.4 循环
bash
#!/bin/bash
# 批量处理图片
for img in ./images/*.jpg; do
echo "处理: $img"
python3 detect.py --source "$img" --save
done
# 批量转换模型精度
for precision in fp32 fp16 int8; do
echo "转换 $precision 模型..."
python3 export.py --precision $precision
done
# while 循环(持续监控 GPU 温度)
while true; do
temp=$(cat /sys/devices/virtual/thermal/thermal_zone0/temp)
echo "GPU 温度: $((temp/1000))°C"
sleep 5
done
1.5 实用模板:部署启动脚本
bash
#!/bin/bash
# deploy.sh --- 一键部署脚本
set -e # 任何命令失败就停止
echo "[1/4] 检查环境..."
python3 -c "import torch; assert torch.cuda.is_available()" || {
echo "错误:CUDA 不可用!"
exit 1
}
echo "[2/4] 导出 ONNX..."
python3 export_onnx.py --weights best.pt --imgsz 640
echo "[3/4] 转换 TensorRT..."
/usr/src/tensorrt/bin/trtexec \
--onnx=best.onnx \
--saveEngine=best.engine \
--fp16
echo "[4/4] 启动推理..."
python3 infer_trt.py --engine best.engine --source 0
echo "部署完成!"
2. 进程管理
推理程序可能要长时间运行,你需要知道怎么管理进程。
2.1 前台 / 后台运行
bash
# 前台运行(占住终端,Ctrl+C 停止)
python3 detect.py --source 0
# 后台运行(加 & 符号)
python3 detect.py --source 0 &
# 终端可以继续用,程序在后台跑
# 查看后台任务
jobs
# 把后台任务拉回前台
fg
# Ctrl+Z 暂停当前任务 → bg 让它在后台继续
2.2 nohup + & (断开 SSH 后继续运行)
bash
# 问题:SSH 断开后,后台程序也会被杀死
# 解决:用 nohup
nohup python3 detect.py --source video.mp4 > output.log 2>&1 &
# 解释:
# nohup 不受 SSH 断开影响
# > output.log 标准输出写入文件
# 2>&1 错误输出也写入同一文件
# & 后台运行
# 查看输出
tail -f output.log
# 查看进程
ps aux | grep detect.py
# 杀死进程
kill <PID>
2.3 tmux(推荐,比 nohup 更好用)
tmux 是终端复用器,可以创建多个"虚拟终端",SSH 断开后自动保持。
bash
# 安装
sudo apt install tmux
# 创建新会话
tmux new -s yolo
# 在 tmux 里运行推理
python3 detect.py --source 0
# 断开会话(程序继续运行)
# 按 Ctrl+B,然后按 D
# 重新连接会话
tmux attach -t yolo
# 列出所有会话
tmux ls
# 杀死会话
tmux kill-session -t yolo
tmux 常用快捷键(先按 Ctrl+B,再按后面的键):
| 快捷键 | 作用 |
|---|---|
d |
断开(detach),回到正常终端 |
c |
创建新窗口 |
n / p |
下一个 / 上一个窗口 |
% |
左右分屏 |
" |
上下分屏 |
| 方向键 | 在分屏间切换 |
3. 系统监控
推理时你需要知道 GPU 是否满载、内存是否够用、温度是否正常。
3.1 GPU 监控(nvidia-smi)
bash
# 一次性查看
nvidia-smi
# 输出示例:
# +-------------------------------+
# | GPU Name Persistence-M|
# | Fan Temp Perf Pwr:Usage/Cap|
# | 40C P0 10W / 15W |
# +-------------------------------+
# | Processes: |
# | GPU PID Type Process name |
# | 0 1234 C python3 | ← 你的推理进程
# +-------------------------------+
# 持续监控(每 1 秒刷新)
watch -n 1 nvidia-smi
# Jetson 专用监控工具(更详细)
sudo tegrastats
# 输出:RAM 2048/4096MB | CPU [45%@1420,38%@1420] | GPU 65%@921 | ...
3.2 CPU / 内存监控
bash
# htop(交互式,推荐)
htop
# 按 q 退出
# 按 F6 选择排序方式(按 CPU%、MEM% 等)
# 查看内存
free -h
# 输出:
# total used free available
# Mem: 3.9Gi 2.1Gi 0.3Gi 1.5Gi
# Swap: 2.0Gi 0.5Gi 1.5Gi
# Jetson 内存很少(Nano 4GB),如果 free 很低:
# 1. 减小 batch size
# 2. 用更小的模型
# 3. 增大 swap
3.3 温度监控
bash
# Jetson 温度
cat /sys/devices/virtual/thermal/thermal_zone*/temp
# 输出是毫度,除以 1000 得到摄氏度
# 一键查看所有温度
for zone in /sys/devices/virtual/thermal/thermal_zone*/temp; do
name=$(cat $(dirname $zone)/type)
temp=$(cat $zone)
echo "$name: $((temp/1000))°C"
done
# 温度安全范围:
# < 60°C:正常
# 60-80°C:高负载,正常但注意散热
# > 80°C:过热,会自动降频(throttling)
3.4 磁盘 I/O
bash
# 查看磁盘读写速度
iotop
# 需要 sudo apt install iotop
# 查看磁盘使用
df -h
# 如果 SD 卡快满了
sudo apt clean
sudo docker system prune -a
rm -rf ~/.cache/pip
4. 网络调试
从 PC 传模型、下载数据集、远程访问推理结果,都需要网络操作。
4.1 基本网络命令
bash
# 查看 IP 地址
ip addr show
# 测试网络连通性
ping 8.8.8.8 # 测外网
ping 192.168.1.1 # 测网关
# 查看端口占用
ss -tlnp
# 或
netstat -tlnp
# 查看网络流量
ifstat # 需要 sudo apt install ifstat
4.2 端口转发(远程查看推理结果)
如果你的推理程序有 Web UI(比如 Gradio),需要通过端口转发在 PC 上查看:
bash
# 在 PC 上执行 SSH 端口转发
ssh -L 8080:localhost:8080 jetson
# 含义:把 Jetson 的 8080 端口映射到 PC 的 8080 端口
# 然后在 PC 浏览器打开 http://localhost:8080
# 也可以用 VS Code 的端口转发功能(更方便)
4.3 下载文件
bash
# wget(最常用)
wget https://example.com/dataset.zip
# 断点续传
wget -c https://example.com/large_file.zip
# curl
curl -O https://example.com/model.onnx
# Python 方式(有进度条)
pip install gdown
gdown https://drive.google.com/uc?id=xxxxx # Google Drive 文件
5. 文本编辑器
5.1 nano(最简单,推荐新手)
bash
nano config.yaml
# 编辑完:
# Ctrl+O → Enter 保存
# Ctrl+X 退出
5.2 vim(高效,建议逐步学)
bash
vim config.yaml
# 模式:
# 按 i 进入编辑模式(可以打字了)
# 按 Esc 回到命令模式
# 输入 :wq 保存并退出
# 输入 :q! 不保存退出
# 最常用操作:
# dd 删除当前行
# yy 复制当前行
# p 粘贴
# /text 搜索 text
# u 撤销
5.3 实际推荐
日常开发用 VS Code Remote-SSH,编辑配置文件用 nano,高频操作熟练后再学 vim。
6. Git 基础
管理你的推理代码和配置。
bash
# 初始化仓库
git init
# 添加文件
git add detect.py config.yaml
# 提交
git commit -m "添加推理脚本"
# 查看状态
git status
# 查看提交历史
git log --oneline
# 克隆别人的项目(最常用)
git clone https://github.com/ultralytics/ultralytics.git
# 创建分支
git checkout -b feature/tensorrt
# 合并分支
git checkout main
git merge feature/tensorrt
部署时最常用的 Git 操作:
bash
# 1. 克隆 YOLO 仓库
git clone https://github.com/ultralytics/ultralytics.git
# 2. 切到特定版本
git checkout v8.1.0
# 3. 拉取更新
git pull
7. 本章实操任务
□ 1. 写一个 Shell 脚本,接收模型路径作为参数,检查文件是否存在后运行推理
□ 2. 用 tmux 创建一个会话,在里面运行一个 Python 脚本,然后断开再重连
□ 3. 用 watch -n 1 nvidia-smi 监控 GPU(如果有)
□ 4. 配置 SSH 端口转发,把远程 8080 端口映射到本地
□ 5. 用 git clone 克隆 ultralytics 仓库
□ 6. 写一个循环脚本,每 5 秒打印一次 CPU 温度
智汇嵌入式实验室 · 7yewh