4、Linux系统基础:常用命令(文件操作、进程管理、网络配置)、Shell脚本编写
各位同学,欢迎来到第四章。
说实话,很多做嵌入式算法部署的工程师,最后都栽在了Linux不熟上。模型跑不起来,第一反应是算法有问题,结果查了半天,发现是权限没给对,或者进程被杀了。这种事我见过太多次了。
所以这一章,咱们把Linux基础打扎实。我不讲那些花里胡哨的,只讲你真正会用到的。
4.1 文件操作命令:你每天都在跟它打交道
嵌入式设备上,你大部分时间都在跟文件打交道——拷贝模型、修改配置文件、查看日志。这几个命令你得闭着眼睛都能敲出来。
4.1.1 文件浏览与查看
ls -l:列出文件详情。我习惯加个-h参数,文件大小会显示成K、M,看着舒服。cat:看小文件。日志文件大了就别用这个了,屏幕会刷爆。tail -f:实时跟踪日志。调试门禁识别程序时,我经常开着它看推理日志。less:看大文件。按/可以搜索关键词,按q退出。
我的习惯:调试时,我会开两个终端。一个跑程序,一个用
tail -f盯着日志。这样问题出在哪,一眼就能看到。
4.1.2 文件复制、移动与删除
cp source dest:复制文件。复制目录要加-r。mv source dest:移动或重命名。这个命令很危险,覆盖文件不会提示你。rm -rf:删除。我曾经在服务器上多打了一个空格,把整个系统删了……嗯,从那以后我每次敲rm之前都会先ls确认一遍。
避坑指南:千万不要在脚本里写
rm -rf /这种命令。我曾经见过有人把训练好的模型目录和系统目录搞混,一键清空,欲哭无泪。
4.1.3 权限管理
嵌入式设备上,权限问题特别常见。你拷贝了一个可执行文件,结果跑不起来,十有八九是没加执行权限。
chmod +x file:给文件加执行权限。chmod 755 file:设置标准权限(所有者可读写执行,其他人只读执行)。chown user:group file:修改文件所有者。
为什么说这个重要?你想想看,门禁设备上跑的人脸识别程序,如果权限设置不对,普通用户都能改你的模型文件,那安全性就全没了。
4.2 进程管理:你的程序跑得好好的,怎么没了?
嵌入式设备资源有限,进程管理直接关系到你的算法能不能稳定运行。
4.2.1 查看进程
ps aux:查看所有进程。我一般配合grep用,比如ps aux | grep face,只看人脸识别相关的进程。top:实时查看进程资源占用。按q退出。htop:比top好看,但需要安装。我个人更喜欢用htop,界面清晰,还能直接杀进程。
4.2.2 终止进程
kill PID:优雅地终止进程。kill -9 PID:强制杀死。这个命令很暴力,进程来不及做清理工作。我建议先用kill,不行再用-9。
实战场景:有一次门禁设备上的人脸识别程序卡死了,界面不动,但进程还在。我用
ps aux | grep face找到PID,然后kill -9强制杀掉,再重新启动,问题解决。
4.2.3 后台运行
你SSH登录到设备上,运行程序,一关终端程序就停了。怎么办?
nohup command &:让程序在后台运行,即使退出终端也不会停。screen或tmux:创建虚拟终端。我习惯用tmux,可以分屏,一边看日志一边改代码。
4.3 网络配置:设备连不上网,一切白搭
嵌入式门禁设备需要联网,要么上传识别记录,要么接收远程指令。网络配置是基本功。
4.3.1 查看网络状态
ifconfig:查看IP地址、MAC地址。注意,现在很多系统用ip addr代替了。ping:测试网络连通性。我一般先ping 127.0.0.1(本机),再ping 网关,最后ping 外网,一步步排查。netstat -tuln:查看端口监听情况。你的算法服务有没有启动,端口有没有被占用,用这个一看便知。
4.3.2 配置网络
ifconfig eth0 192.168.1.100 netmask 255.255.255.0:临时设置IP。- 修改
/etc/network/interfaces或/etc/netplan/*.yaml:永久配置。
我的经验:在嵌入式设备上,我建议用静态IP,不要用DHCP。为什么?因为门禁设备需要固定IP,方便远程管理和调试。DHCP一旦租约过期,IP变了,你就连不上设备了。
4.4 Shell脚本编写:把重复的工作自动化
你每天都要做同样的事:编译、拷贝、重启服务。为什么不写个脚本一键搞定?
4.4.1 第一个脚本
#!/bin/bash
# 这是一个简单的启动脚本
echo "正在启动人脸识别服务..."
cd /home/face_recognition
./run_face_detection.sh
echo "服务已启动"
保存为start.sh,然后chmod +x start.sh,运行./start.sh即可。
4.4.2 变量与参数
#!/bin/bash
MODEL_PATH="/data/models/face_model.pt"
CONFIG_PATH="/etc/face_recognition/config.yaml"
echo "模型路径: $MODEL_PATH"
echo "配置文件: $CONFIG_PATH"
4.4.3 条件判断
你想想看,如果模型文件不存在,脚本直接运行程序,肯定会报错。所以要先判断。
#!/bin/bash
if [ -f "/data/models/face_model.pt" ]; then
echo "模型文件存在,开始启动..."
./run_face_detection.sh
else
echo "错误:模型文件不存在!"
exit 1
fi
4.4.4 循环与批量操作
比如你要批量处理1000张图片,用循环最方便。
#!/bin/bash
for img in /data/images/*.jpg; do
echo "处理图片: $img"
./process_image.sh $img
done
实战案例:我之前部署一个门禁项目,需要每天凌晨重启服务并清理日志。我写了一个cron脚本,每天凌晨3点执行:
从此再也不用半夜爬起来手动重启了。
0 3 * * * /home/face_recognition/restart.sh从此再也不用半夜爬起来手动重启了。
4.5 本章小结
这一章的内容,说白了就是让你能在Linux系统上「活下来」。文件操作让你能管理模型和日志,进程管理让你能控制程序运行,网络配置让你能连上设备,Shell脚本让你能偷懒。
我个人建议,把这些命令记在笔记本上,或者做成一个速查表。刚开始不熟很正常,多用几次就记住了。下一章,咱们开始真正接触嵌入式开发环境,到时候这些命令你会用得飞起。