大家好!今天咱们聊个每个Linux用户都绕不开的话题——进程管理。我猜你肯定遇到过这些情况:电脑突然变卡,鼠标点不动;远程服务器CPU飙到100%,网站打不开;或者明明关了程序,后台还偷偷跑着进程占内存……别慌!今天我把压箱底的进程管理技巧掏出来,从“找进程”到“杀进程”,再到“管服务”,保证你看完能解决95%的日常问题!
一、为什么需要懂进程管理?
简单说,进程就是正在运行的程序。比如你打开的浏览器、编辑器,服务器上跑的Nginx、MySQL,都是进程。不懂进程管理,你就没法:
- 快速定位卡顿的“元凶”(哪个进程在疯狂吃CPU/内存?)
- 防止程序“僵尸化”(进程死了却不退出,占着资源不放)
- 远程维护服务器(不用跑机房,在家就能重启服务)
二、快速查看进程:3个命令搞定
1. ps:静态快照(适合脚本/精准查询)
ps是最基础的进程查看命令,常用两种用法:
- ps aux:显示所有用户的进程(a=all用户,u=详细用户信息,x=包括后台进程)。输出第一行是表头,重点看USER(用户)、PID(进程ID)、%CPU(CPU占用)、%MEM(内存占用)、COMMAND(进程名)。
比如:$ ps aux | grep nginx(过滤出nginx相关进程)。 - ps -ef:显示完整格式的进程列表(e=所有进程,f=完整格式)。适合配合grep搜索,比如$ ps -ef | grep mysql。
2. top:动态监控(适合实时排查卡顿)
top是交互式工具,启动后按q退出。它会实时刷新进程状态,默认按CPU占用排序。
- 按M(大写):按内存占用排序(内存大的排前面)。
- 按P(大写):回到CPU排序(默认)。
- 按k:输入PID强制终止进程(比如输入1234再回车,相当于kill 1234)。
举个栗子:我之前远程服务器突然变慢,用top一开,发现有个php-fpm进程占了90% CPU,直接k掉就恢复了!
3. htop:更友好的交互式工具(推荐安装)
htop是top的升级版,界面更直观(支持鼠标操作),还能直接看到进程树关系。安装也简单:
- Ubuntu/Debian:sudo apt install htop
- CentOS/Fedora:sudo yum install htop
启动后,按F2可以自定义显示列(比如加IO读写),按F9选择信号(比如SIGKILL强制终止)。
三、进程状态解读:看懂这些字母就够了
在ps aux或top的输出里,有一列STAT(或S)表示进程状态,常见状态有:
- R(Running):正在运行或等待运行(CPU核心忙时可能在“就绪”队列)。
- S(Sleeping):可中断睡眠(等待输入/输出,比如等网络数据,能被信号唤醒)。
- D(Uninterruptible Sleep):不可中断睡眠(通常是硬件操作,比如读写磁盘,强行终止可能丢数据)。
- Z(Zombie):僵尸进程(子进程死了,但父进程没回收资源,像“尸体”占着坑)。
- T(Stopped):停止状态(比如用Ctrl+Z暂停了进程)。
重点提醒:僵尸进程(Z)要赶紧处理!否则会越积越多,占用PID资源。杀僵尸进程得先杀它的父进程(用ps -ef看PPID父进程ID),父进程死了,僵尸会被init(或systemd)回收。
四、管理进程:启动、停止、后台运行
1. 启动进程:前台vs后台
- 前台启动:直接运行命令(比如./start.sh),会占用当前终端,按Ctrl+C终止。
- 后台启动:加&(比如./start.sh &),进程在后台跑,终端还能继续用。但关闭终端会连带终止进程(除非用nohup)。
2. 终止进程:温柔点还是暴力点?
- kill PID:发送SIGTERM信号(温柔终止,进程有机会保存数据)。
- kill -9 PID:发送SIGKILL信号(强制终止,直接“杀”掉,可能丢数据)。
- pkill 进程名:按名称杀进程(比如pkill nginx杀所有nginx进程)。
- pgrep 进程名:先查PID(比如pgrep mysql返回MySQL的PID)。
3. 后台进程进阶:nohup+&
远程服务器上跑长时间任务(比如备份),断开终端会终止进程?用这组合:
nohup ./long_task.sh > task.log 2>&1 & # 输出重定向到task.log,后台运行
这样即使关了终端,任务也会继续跑,日志存在task.log里。
五、高阶操作:用systemctl管服务(服务器必备)
现代Linux系统(如Ubuntu 16.04+、CentOS 7+)用systemd管理服务,systemctl是最核心的命令。
1. 常用操作
- 启动服务:sudo systemctl start nginx
- 停止服务:sudo systemctl stop nginx
- 重启服务:sudo systemctl restart nginx(改配置后常用)
- 查看状态:sudo systemctl status nginx(看是否运行、日志)
- 开机启动:sudo systemctl enable nginx
- 禁用开机启动:sudo systemctl disable nginx
2. 实战案例:网站突然打不开
场景:用户反馈访问网站提示“502 Bad Gateway”,可能是Nginx挂了。
解决步骤:
- 查看Nginx状态:systemctl status nginx,发现显示failed(失败)。
- 尝试重启:systemctl restart nginx,如果成功,问题解决。
- 如果重启失败,看日志找原因:journalctl -u nginx -e(查看Nginx的详细日志)。
六、注意事项
- 别乱杀PID=1的进程(通常是systemd或init),会导致系统崩溃!
- 用kill -9前先试kill(温柔终止),避免数据丢失(比如数据库写入中途)。
- 远程操作服务器时,终止关键服务(如MySQL)前务必确认影响,最好先通知团队。
课后练习
- 打开终端,用top或htop观察进程,找到占用CPU最高的进程,记下它的PID和名称。
- 启动一个后台进程(比如sleep 1000 &),然后用ps aux | grep sleep验证是否在运行。
- 尝试用systemctl查看当前系统的nginx服务状态(如果没有安装,换成apache2或mysql)。