嵌入式必学Shell命令精讲:进程、磁盘与网络操作实战
嵌入式设备资源有限,进程跑飞了要能快速定位,磁盘满了要能找到罪魁祸首,网络不通要能逐层排查。这套命令就是你的"听诊器"和"手术刀"。
一、进程管理命令
1.1 进程是什么?
简单说,进程就是运行中的程序。你写了一段C代码,编译生成可执行文件,它静静地躺在磁盘上只是个文件。当你执行它,操作系统把它加载到内存、分配CPU资源,它就变成了进程。每个进程有唯一的PID(Process ID)。
1.2 ps — 查看进程快照
ps命令拍摄进程的"照片",显示某一瞬间的进程状态。
# 最常用组合:查看当前用户的所有进程psaux# 查看特定进程psaux|greppython# 只看当前终端的进程ps-ef# 以树形结构显示进程父子关系psaxjfps aux输出各列含义:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 168 11 ? Ss 10:00 0:02 /sbin/init user 1234 2.5 1.3 500 26 pts/0 R+ 10:30 0:01 python3 app.py| 列 | 含义 |
|---|---|
| USER | 进程所有者 |
| PID | 进程ID(杀进程就靠它) |
| %CPU | CPU占用百分比 |
| %MEM | 内存占用百分比 |
| VSZ | 虚拟内存大小(KB) |
| RSS | 物理内存大小(KB) |
| STAT | 进程状态(R=运行,S=睡眠,Z=僵尸,D=不可中断睡眠) |
| COMMAND | 启动该进程的命令 |
1.3 top — 实时进程监控
top是动态版的ps,每隔几秒自动刷新,类似Windows的任务管理器。
top# 启动top进入top界面后的常用交互操作:
| 按键 | 功能 |
|---|---|
P | 按CPU占用排序 |
M | 按内存占用排序 |
k | 输入PID杀死进程 |
1 | 显示各CPU核心详情 |
q | 退出 |
h | 帮助 |
top界面头部还有整体系统信息:负载均衡(load average)、总任务数、CPU使用率、内存使用情况等。
load average三个值分别表示1分钟、5分钟、15分钟的系统平均负载。单核CPU下,值超过1.0说明负载较高;4核CPU则4.0是警戒线。
1.4 htop — 更好用的top
sudoaptinstallhtophtophtop是top的增强版,彩色界面、支持鼠标操作、直观的进度条,用过就回不去了。
1.5 kill — 终止进程
kill1234# 发送SIGTERM信号,优雅终止进程kill-91234# 发送SIGKILL信号,强制杀死进程kill-151234# SIGTERM(默认信号),允许进程清理资源killallpython3# 按进程名杀掉所有python3进程pkill-f"app.py"# 按命令行匹配杀进程SIGTERM vs SIGKILL的区别:
| 特性 | SIGTERM (15) | SIGKILL (9) |
|---|---|---|
| 能否被捕获 | 能,进程可自定义处理 | 不能,内核直接终止 |
| 资源清理 | 有机会清理 | 没有,立即终止 |
| 推荐程度 | 首选 | 最后手段 |
实战经验:先用
kill PID(SIGTERM),给进程3-5秒清理时间。如果还活着,再上kill -9。直接kill -9可能导致临时文件残留、数据库未正常关闭等问题。
1.6 后台运行进程
# 末尾加&,让程序在后台运行python3 app.py&# nohup:终端关闭后进程不会被杀死nohuppython3 app.py&# 输出默认重定向到nohup.out文件# 指定输出文件nohuppython3 app.py>app.log2>&1&# 查看后台任务jobs# 查看当前终端的后台任务fg# 将最近的后台任务调到前台bg# 让暂停的任务在后台继续运行二、磁盘管理命令
2.1 df — 查看磁盘使用情况
df# 查看所有挂载分区的使用情况df-h# 人性化显示(GB/MB)df-T# 显示文件系统类型df-i# 查看inode使用情况输出示例:
Filesystem Size Used Avail Use% Mounted on /dev/sda1 50G 20G 28G 42% / tmpfs 2.0G 0 2.0G 0% /dev/shm嵌入式场景:开发板经常遇到存储空间不足,
df -h是排查第一步。Use%超过90%就要警惕了。
2.2 du — 查看目录大小
du-sh/home/user# 查看某个目录总大小(-s=summary,-h=human)du-sh*# 查看当前目录下每个子目录/文件大小du-h--max-depth=1/home/user# 只显示一级子目录大小du-sh*|sort-rh# 按大小排序,找出最占空间的目录实际排查磁盘满的流程:
# 第一步:查看哪个分区满了df-h# 第二步:进入该分区根目录,找出最大的目录cd/sudodu-sh*|sort-rh|head-10# 第三步:进入最大的目录,继续排查cd/varsudodu-sh*|sort-rh|head-10# 通常会发现是/var/log日志文件太大sudorm/var/log/syslog.1# 删除旧日志# 或者用journalctl清理systemd日志sudojournalctl --vacuum-size=100M2.3 mount/umount — 挂载与卸载
# 查看当前挂载信息mount# 挂载U盘sudomount/dev/sdb1 /mnt/usb# 挂载NFS共享(嵌入式开发常用)sudomount-tnfs192.168.1.100:/shared /mnt/nfs# 卸载sudoumount/mnt/usbsudoumount-l/mnt/usb# 懒卸载(如果设备忙,等不忙了自动卸载)2.4 fdisk/lsblk — 磁盘分区信息
lsblk# 列出所有块设备(简洁直观)sudofdisk-l# 列出所有磁盘及分区信息(详细)三、网络操作命令
3.1 ifconfig / ip — 查看和配置网络接口
# 查看所有网络接口ifconfig# 老命令,部分新系统已不预装ipaddr# 新命令,推荐使用ipa# 简写# 查看特定接口ifconfigeth0ipaddr show eth0# 临时配置IP地址sudoifconfigeth0192.168.1.100 netmask255.255.255.0sudoipaddradd192.168.1.100/24 dev eth0# 启用/禁用网卡sudoifconfigeth0 upsudoiplinkseteth0 upsudoiplinkseteth0 down注意:
ifconfig配置的IP在重启后会丢失。永久配置需要修改/etc/netplan/配置文件或/etc/network/interfaces。
3.2 ping — 测试网络连通性
ping192.168.1.1# 测试局域网网关ping8.8.8.8# 测试外网连通性ping-c4www.baidu.com# 发送4个包后停止(-c=count)ping-i0.5192.168.1.100# 每0.5秒发一次(默认1秒)ping不通时的排查思路:
1. ping 127.0.0.1 → 网卡驱动是否正常 2. ping 本机IP → IP配置是否正确 3. ping 网关IP → 局域网是否连通 4. ping 8.8.8.8 → 外网是否连通 5. ping www.baidu.com → DNS是否正常3.3 netstat / ss — 查看网络连接
# 查看所有监听端口netstat-tlnp# t=tcp, l=listening, n=numeric, p=programss-tlnp# 新命令,功能相同但更快# 查看所有连接(含已建立的)netstat-anss-an# 查看路由表netstat-rniproute输出示例:
Proto Local Address Foreign Address State PID/Program tcp 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd tcp 0.0.0.0:80 0.0.0.0:* LISTEN 5678/nginx3.4 curl / wget — 网络请求与下载
# 下载文件wgethttps://example.com/file.tar.gzwget-chttps://example.com/file.tar.gz# 断点续传# HTTP请求curlhttp://localhost:8080/api/status# GET请求curl-XPOST http://localhost:8080/api# POST请求curl-Ihttps://www.baidu.com# 只看响应头# 嵌入式场景:下载固件到开发板wgethttp://192.168.1.50:8000/firmware.bin-O/tmp/firmware.bin3.5 scp — 远程文件传输
# 从本机传到远程scpfile.tar.gz user@192.168.1.100:/home/user/# 从远程传到本机scpuser@192.168.1.100:/home/user/log.txt ./# 传目录(-r)scp-rproject/ user@192.168.1.100:/home/user/# 指定端口(-P,大写)scp-P2222file.txt user@192.168.1.100:/tmp/3.6 nc — 网络调试利器
nc(netcat)被誉为网络工具中的"瑞士军刀":
# 在开发板上监听端口,等待接收文件nc-l8888>received_file.bin# 在PC上发送文件到开发板nc192.168.1.1008888<firmware.bin# 测试端口是否开放nc-zv192.168.1.10022# 测试SSH端口四、综合实战:开发板网络调试
场景:开发板通过网线连接PC,需要交叉编译程序并传到开发板运行。
# 1. PC上配置IPsudoifconfigeth0192.168.1.50 netmask255.255.255.0# 2. 开发板上配置IP(通过串口终端)ifconfigeth0192.168.1.100 netmask255.255.255.0# 3. 互ping测试ping192.168.1.100# PC上ping开发板ping192.168.1.50# 开发板上ping PC# 4. PC上交叉编译arm-linux-gnueabihf-gcc-ohello hello.c# 5. scp传到开发板scphello root@192.168.1.100:/root/# 6. 开发板上运行chmod+x hello ./hello# 7. 如果程序卡死,PC上查看psaux|grephello# 找PIDkill-9<PID># 强杀五、总结
进程管理让你掌控系统运行状态,磁盘排查帮你解决空间告警,网络调试是嵌入式开发中PC与开发板协同的桥梁。这三组命令是日常开发中使用频率极高的工具,建议结合实际开发板多做练习,形成完整的调试思维链:发现问题→定位问题→解决问题。