Linux进程管理——ps/top/kill和机器人进程监控 面试翻车现场上周有个候选人简历上写着精通Linux开发。我问他你的机器人程序跑飞了CPU占用100%你怎么排查他愣了三秒说重启我说然后呢他说再重启这就是典型的会用Linux但不懂进程管理。今天这篇咱们把进程管理这件事彻底说清楚。面试考得比你想象的多。进程是什么简单说一个运行起来的程序就是进程。你执行了./robot_node系统就创建了一个进程。每个进程有唯一的编号叫PID有自己独立的内存空间有自己的运行状态。Linux是多任务系统同一时刻跑着几百个进程。你的机器人程序只是其中之一。它和系统的其他进程共享CPU、内存这些资源。ps进程的快照ps是最基础的进程查看命令。直接敲ps你只能看到当前终端的几个进程没什么用。常用的组合是ps aux$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 169344 13000 ? Ss 09:00 0:03 /sbin/init robot 12345 85.2 2.3 524288 192000 ? Sl 10:30 12:45 ./robot_node robot 12400 0.5 0.8 312000 65000 ? Sl 10:30 0:30 /opt/ros/humble/lib/robot_state_publisher各列含义PID是进程号%CPU和%MEM是资源占用RSS是实际占用的物理内存KBSTAT是进程状态COMMAND是启动命令。进程状态STAT几个常见值R是运行中S是睡眠等待事件D是不可中断睡眠通常在等IOZ是僵尸进程T是停止状态。看到Z要小心——僵尸进程说明父进程没有正确回收子进程的资源。如果你只想找特定进程用ps aux | grep robot。更直接的方式是pgrep robot只返回PID。top实时监控ps是快照top是实时监控。敲top你会看到一个不断刷新的界面top - 14:30:00 up 5 days, 3:20, 2 users, load average: 1.25, 0.98, 0.85 Tasks: 256 total, 2 running, 254 sleeping, 0 stopped, 0 zombie %Cpu(s): 35.2 us, 5.1 sy, 0.0 ni, 58.5 id, 1.0 wa, 0.0 hi, 0.2 si MiB Mem: 16384.0 total, 8200.0 free, 5100.0 used, 3084.0 buff/cache MiB Swap: 4096.0 total, 4096.0 free, 0.0 used. 10500.0 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND 12345 robot 20 0 524288 192000 45000 S 85.2 2.3 12:45 robot_node 12400 robot 20 0 312000 65000 32000 S 0.5 0.8 0:30 robot_state_pub第一行是系统运行时间和负载。load average三个数字分别是1分钟、5分钟、15分钟的平均负载。如果持续高于CPU核心数说明系统过载了。在top界面里按P按CPU排序按M按内存排序按k可以直接输入PID来杀进程按q退出。还有个更现代的工具叫htop彩色界面支持鼠标可以展开看线程。安装sudo apt install htop。做机器人开发的建议装一个。kill终止进程找到问题进程后你需要终止它。kill命令发信号给进程。最常用的kill 12345 # 发SIGTERM优雅终止 kill -9 12345 # 发SIGKILL强制杀死 kill -15 12345 # 和kill 12345一样SIGTERM和SIGKILL的区别是面试常考题。SIGTERM允许进程做清理工作关闭文件、释放内存进程可以捕获并忽略它。SIGKILL不能被捕获内核直接回收资源可能导致数据丢失。最佳实践先kill PIDSIGTERM等几秒如果进程还在再kill -9 PID。还有个killall命令按名字杀进程killall robot_node。把所有叫这个名字的进程全干掉。用的时候小心。机器人开发中的进程管理ROS2的节点本质上就是进程。一个机器人系统通常跑着几十个节点激光雷达驱动、IMU驱动、导航、规划、控制……每个都是独立进程。当你的机器人卡了第一步就是htop看哪个进程吃CPU。常见情况某个节点的回调函数里有死循环CPU飙到100%。用top定位PID然后kill -9杀掉重启那个节点。内存泄漏导致RSS不断增长。你可以写个脚本定期记录RSSwhile true; do ps -p 12345 -o rss memory_log.txt sleep 10 done如果RSS持续上涨不回落基本确认内存泄漏。接下来用valgrind或AddressSanitizer定位具体位置。僵尸进程在机器人系统里偶尔会出现。通常是因为你用system()或fork()启动了子进程但没等待它结束。ps aux看到STAT为Z的进程就是。解决方法是修复父进程的wait逻辑。进程优先级机器人系统里有些任务比另一些更关键。实时控制环路不能被日志写入抢CPU。nice命令调整优先级nice -n -10 ./realtime_controller # 高优先级-20到19越小越高 nice -n 10 ./log_writer # 低优先级注意普通用户只能调高nice值降低优先级降低nice值提高优先级需要root。更底层的方案是chrt设置实时调度策略sudo chrt -r 99 ./realtime_controller这会让进程使用SCHED_RR实时调度。但别滥用——实时进程如果死循环整个系统都会卡死。面试常见考点进程和线程的区别——进程有独立内存空间线程共享进程内存。ROS2默认每个节点一个进程节点内的回调在同一进程的线程中执行。什么是僵尸进程怎么避免——子进程退出后父进程没调用wait回收就变僵尸。避免方法fork后调用wait/waitpid或者忽略SIGCHLD信号。怎么查看某个进程的详细信息——cat /proc/PID/status看状态cat /proc/PID/maps看内存映射ls -l /proc/PID/fd看打开的文件描述符。/proc是内核提供的进程信息接口。top里的load average怎么看——三个值是1/5/15分钟的平均 runnable 任务数。持续高于CPU核心数说明过载。4核机器load average到8就该排查了。进程管理的实战技巧在机器人项目中经常需要同时运行多个进程传感器驱动、定位算法、路径规划等。用ps aux加grep可以快速查找特定进程htop比top更直观。一个实用技巧是用nohup或screen让进程在断开SSH后继续运行。还有kill -15优雅退出和kill -9强制杀死的区别面试时经常被问到这个知识点。补充一个实用命令lsof -i :端口号 可以查看哪个进程占用了特定端口在排查端口冲突时非常有用。另外fuser命令也有类似功能。在面试中展示你对Linux进程管理的系统理解会让面试官对你的工程能力更有信心。给你的建议把htop装起来日常开发就看着它。养成习惯启动机器人程序前先看看系统负载跑完之后确认所有进程都正常退出了。写个简单的监控脚本定期检查关键进程的存活状态。生产环境的机器人必须有这个——你不可能24小时盯着屏幕看进程是不是还活着。面试的时候进程管理这块不要只背命令。面试官想听的是你怎么用这些工具解决实际问题。准备一两个我的机器人程序出了XX问题我用XX命令定位并解决的故事比背十条命令有用。上一篇第83篇 Linux权限管理——chmod/chown和机器人设备的权限配置下一篇预告第85篇 Linux网络配置——IP/DNS/防火墙和机器人联网调试

本月热点