Linux 进程管理与监控——ps/top/htop/kill/systemctl
Linux 进程管理与监控——ps/top/htop/kill/systemctl
💡 提示: 本文所有命令在 Ubuntu 22.04 / Debian 12 / Fedora 38 / Arch Linux 下验证。
一、进程是什么
程序是磁盘上的文件;进程是程序运行起来之后在内存里的实体。每个进程有一个唯一编号叫PID****(Process ID)。
进程的关键属性
| 属性 | 说明 |
|---|---|
| PID | 进程 ID,唯一标识 |
| PPID | 父进程 ID,谁启动了它 |
| UID/USER | 哪个用户在跑 |
| %CPU | CPU 占用百分比 |
| %MEM | 内存占用百分比 |
| VSZ | 虚拟内存大小(KB) |
| RSS | 实际占用物理内存(KB) |
| STAT | 进程状态(见下表) |
| COMMAND | 启动命令 |
进程状态码
| 状态码 | 含义 |
|---|---|
| R | Running,正在运行或可运行 |
| S | Sleeping,等待事件(常见) |
| D | Disk Sleep,不可中断睡眠,这种状态无法被 kill -9 杀掉,只能等 IO 完成或重启系统。 |
| T | Stopped,被暂停(Ctrl+Z) |
| Z | Zombie,僵尸进程(已退出但未被父进程回收) |
| I | Idle,空闲内核线程 |
💡 提示: 状态码后面跟 < 表示高优先级,N 表示低优先级,s 表示会话领导,l 表示多线程,+ 表示前台进程组。
二、ps——查看进程快照
ps(Process Status)输出的是某一时刻的进程列表,不会动态更新。
常用组合
# 查看当前终端的进程
ps
# 查看所有用户的所有进程(常用)
ps aux
# 树形显示父子关系
ps auxf
# 只看某个用户的进程
ps -u fqy0610
# 只看某个名字的进程(模糊匹配)
ps aux | grep nginx
# 找进程 PID,[n] 让 grep 匹配 nginx 但不匹配自身(不显示 grep 自身)
ps aux | grep ‘[n]ginx’
ps aux 各列含义
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 168700 11800 ? Ss Jun28 0:04 /sbin/init
| 列 | 说明 |
|---|---|
| USER | 运行该进程的用户 |
| PID | 进程 ID |
| %CPU | CPU 使用率 |
| %MEM | 内存使用率 |
| VSZ | 虚拟内存(KB) |
| RSS | 物理内存(KB) |
| TTY | 关联的终端,? 表示无终端(后台服务) |
| STAT | 进程状态 |
| START | 启动时间 |
| TIME | 累计 CPU 时间 |
| COMMAND | 命令及参数 |
如果 RSS 持续增长,可能说明有内存泄漏。
pgrep 和 pstree
# 只返回 PID,不需要 grep 过滤
pgrep nginx
pgrep -u root sshd # 指定用户
# 树形显示(更清晰)
pstree
pstree -p # 显示 PID
pstree -u # 显示用户名
三、top——实时进程监控
top 是内置的实时监控工具,每 3 秒自动刷新。
top
top -u fqy0610 # 只显示某用户的进程
top -p 1234,5678 # 只监控指定 PID
top 界面解读
top - 11:22:08 up 2 days, 3:14, 2 users, load average: 0.52, 0.48, 0.43
Tasks: 312 total, 1 running, 311 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.3 us, 0.8 sy, 0.0 ni, 96.5 id, 0.3 wa, 0.0 hi, 0.1 si
MiB Mem : 15940.5 total, 4210.3 free, 8320.1 used, 3410.1 buff/cache
MiB Swap: 2048.0 total, 1848.2 free, 199.8 used. 6890.4 avail Mem
| 字段 | 含义 |
|---|---|
| load average | 1/5/15 分钟平均负载,超过 CPU 核数就说明有排队,对于单核,负载 < 1 正常;对于 8 核,负载 < 8 正常。 |
| us | 用户空间 CPU 时间 |
| sy | 内核空间 CPU 时间 |
| wa | IO 等待(高说明磁盘是瓶颈) |
| id | 空闲(越高越轻松) |
| buff/cache | 文件缓存,系统会自动回收 |
top 交互快捷键
| 按键 | 作用 |
|---|---|
| q | 退出 |
| 1 | 展开显示每个 CPU 核的使用率 |
| M | 按内存使用率排序 |
| P | 按 CPU 使用率排序(默认) |
| T | 按累计 CPU 时间排序 |
| k | 输入 PID 发送信号(杀进程) |
| r | 输入 PID 调整优先级(renice) |
| f | 选择显示哪些列 |
| u | 过滤显示某用户的进程 |
| H | 切换显示线程 |
| d | 修改刷新间隔 |
| Shift+W | 保存配置到 ~/.toprc |
四、htop——更好用的 top
htop 是 top 的增强版,彩色界面,支持鼠标点击,功能更强。
# 安装
sudo apt install htop # Debian/Ubuntu
sudo dnf install htop # Fedora/RHEL
sudo pacman -S htop # Arch
# 启动
htop
htop 界面优势
·彩色进度条:CPU、内存使用一目了然
·鼠标支持:点击列名排序,点击进程选中
·树形视图:F5 切换进程树
·搜索过滤:/ 搜索,\ 过滤
·多选操作:Space 标记多个进程
htop 常用快捷键
| 按键 | 作用 |
|---|---|
| F1 | 帮助 |
| F2 | 设置(颜色/显示列/CPU meter 样式) |
| F3 / / | 搜索进程名 |
| F4 | 过滤(只显示匹配的进程) |
| F5 | 树形视图切换 |
| F6 | 选择排序列 |
| F9 | 发送信号(图形化 kill) |
| F10 / q | 退出 |
| u | 过滤用户 |
| Space | 标记/取消标记进程 |
| k | 发送信号给选中进程 |
💡 提示: htop 的 F2 → Display options → Tree view 可以设置默认启动就是树形视图,比 top 更直观。不同版本菜单位置可能略有不同,搜索 Tree view 选项即可。
五、kill——向进程发送信号
kill 不只是"杀进程",准确说是向进程发送信号,进程可以选择响应方式。
常用信号
| 信号编号 | 信号名 | 含义 | 能被忽略? |
|---|---|---|---|
| 1 | SIGHUP | 重新加载配置(不重启进程) | 能 |
| 2 | SIGINT | 中断(等同于 Ctrl+C) | 能 |
| 9 | SIGKILL | 强制立即终止 | 不能 |
| 15 | SIGTERM | 优雅终止(默认) | 能 |
| 18 | SIGCONT | 继续运行(恢复暂停的进程) | — |
| 19 | SIGSTOP | 暂停进程(等同于 Ctrl+Z) | 不能 |
** kill -9 是最强手段,但也最危险,优先用kill -15。**
# 默认发送 SIGTERM(优雅退出)
kill 1234
# 强制杀死(进程无法忽略)
kill -9 1234
kill -SIGKILL 1234
# 让进程重新加载配置(nginx/sshd 常用)
kill -1 1234
kill -HUP 1234
# 按进程名发送信号(不需要先查 PID)
pkill nginx
pkill -9 firefox
pkill -HUP sshd
# 向某用户的所有进程发送信号
pkill -u testuser
# killall:按精确名字匹配
killall nginx
killall -9 chrome
⚠️ 注意: 优先用 kill -15(SIGTERM),给进程机会做清理工作(关文件、写日志、释放锁)。只有在进程无响应时才用 kill -9,后者不给进程任何收尾机会。
查 PID 再杀的完整流程
# 方法一:ps + grep + kill
ps aux | grep nginx
kill 12345
# 方法二:pgrep + kill(一步到位)
kill $(pgrep nginx)
# 方法三:pkill(简洁)
pkill nginx
六、nice 和renice——进程优先级
Linux 用 nice 值控制进程的 CPU 调度优先级:
·范围:-20(最高优先级)到 +19(最低优先级)
·默认值:0
·普通用户只能调高 nice 值(降低优先级),调低 nice 值(提高优先级)需要 root
# 以低优先级启动(nice 值 +10,让其他任务优先)
nice -n 10 python backup.py
# 以高优先级启动(需要 root)
sudo nice -n -5 ./important_task.sh
# 调整正在运行进程的优先级
renice -n 15 -p 1234 # 把 PID 1234 调低优先级
sudo renice -n -5 -p 1234 # 提高优先级(需要 root)
# 按进程名批量调整
renice -n 10 -u fqy0610 # 调低某用户所有进程的优先级
💡 实用场景: 跑耗时的编译任务、数据处理脚本时,用 nice -n 19 启动,让它在后台慢慢跑,不影响前台操作的流畅度。
七、systemctl——管理系统服务
系统服务(比如 SSH、Nginx、MySQL)由systemd 统一管理,systemctl 是操控 systemd 的命令。
基础操作
# 查看服务状态(常用)
systemctl status nginx
systemctl status sshd
# 启动/停止/重启
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
# 如果服务启动失败,systemctl status 会显示红色 failed 和最后几行错误日志。
# 重新加载配置(不重启进程)
sudo systemctl reload nginx
# 开机自启/禁用自启
sudo systemctl enable nginx
sudo systemctl disable nginx
# 同时启动并设置开机自启
sudo systemctl enable --now nginx
# 强制立即终止(相当于 kill -9)
sudo systemctl kill nginx
# systemctl kill 默认发送 SIGTERM,可以用 --signal 指定其他信号。
查看服务信息
# 列出所有正在运行的服务
systemctl list-units --type=service --state=running
# 列出所有服务(包括未运行的)
systemctl list-units --type=service --all
# 查看开机自启状态
systemctl is-enabled nginx
# 查看服务的日志
journalctl -u nginx
journalctl -u nginx -f # 实时跟踪
journalctl -u nginx --since “1 hour ago”
journalctl -u nginx -n 50 # 最近 50 行
服务状态含义
| 状态 | 说明 |
|---|---|
| active (running) | 正在运行 |
| active (exited) | 已完成(一次性任务) |
| inactive (dead) | 未运行 |
| failed | 启动失败 |
| activating | 正在启动 |
常用服务名参考
| 服务 | 常用名 |
|---|---|
| SSH 服务 | ssh 或 sshd |
| Nginx | nginx |
| Apache | apache2(Debian)/ httpd(RHEL) |
| MySQL | mysql 或 mysqld |
| PostgreSQL | postgresql |
| Docker | docker |
| 防火墙 UFW | ufw |
| 蓝牙 | bluetooth |
| 网络管理 | NetworkManager |
如果不知道服务名,用 systemctl list-units --type=service 列出所有服务。
八、后台运行与 nohup
前台和后台
# 正常启动(前台运行,终端被占用)
python server.py
# 在后台启动(加 &)
python server.py &
# 把前台进程推到后台(先 Ctrl+Z 暂停,再 bg 继续)
python server.py
# Ctrl+Z
bg
# 把后台进程拉回前台
fg
fg %1 # 指定 job 编号
# 查看后台任务列表
jobs
jobs -l # 显示 PID
**nohup——**关闭终端后继续跑
普通后台进程(&)在关掉终端或 SSH 断线后会收到 SIGHUP 信号而退出。nohup 让进程忽略这个信号:
# 关掉终端也不停
nohup python server.py &
# 输出重定向,nohup 不会自动把进程设为后台,必须加 &(默认输出到 nohup.out)
nohup python server.py > server.log 2>&1 &
# 查看是否还在运行
ps aux | grep server.py
# 找到 PID 后停止
kill $(pgrep -f server.py)
💡 提示: 如果要长期跑后台服务,推荐用 systemctl(上面第七节)或 screen/tmux 管理会话,比 nohup 更可控、更好排查。
九、实战排查:CPU/内存跑满怎么办
场景一:CPU 突然 100%
# 第一步:看谁在占 CPU
top # 默认按 CPU 排序
# 或者
ps aux --sort=-%cpu | head -10
# 第二步:确认是哪个进程
ps aux | grep
# 第三步:看这个进程在干什么
ls -l /proc//exe # 查可执行文件路径
cat /proc//cmdline | tr ‘\0’ ’ '# 查完整命令行
lsof -p | head -20 # 查打开的文件
# 第四步:决定是等待、降优先级还是杀掉
renice -n 19 -p # 先降优先级,给系统喘息机会
kill -15 # 确认要停则优雅终止
场景二:内存不够用(OOM)
# 查内存占用 Top 10
ps aux --sort=-%mem | head -10
# 查系统内存概览
free -h
# 查 OOM Killer 有没有杀过进程(内核日志)
sudo dmesg | grep -i “killed process”
sudo journalctl -k | grep -i oom
# 查 /proc/meminfo 详情
cat /proc/meminfo | grep -E “MemTotal|MemFree|MemAvailable|Cached”
场景三:僵尸进程(Zombie)
僵尸进程已经退出,但父进程没有调用wait() 回收,进程表里留了个空壳。僵尸进程本身不占 CPU 和内存,但占用 PID 表条目,大量僵尸会导致 PID 耗尽。
# 查僵尸进程
ps aux | grep Z
ps aux | awk ‘$8 == “Z”’
# 找父进程
ps -o ppid= -p <僵尸PID> # 返回父进程 PID
ps aux | grep
# 杀父进程(父进程退出后,僵尸会被 init 回收)
# 如果父进程是 systemd 管理的服务,可以 systemctl restart 服务 来清理。
kill -9
⚠️ 注意: 不要直接 kill -9 僵尸进程,僵尸进程已经"死"了,kill 无效。正确方式是通知(kill -17)或重启父进程,让父进程回收它。
十、实用工具补充
以下工具在日常排查中非常有用,按需了解。
**vmstat——**系统资源概览
vmstat 2 5 # 每 2 秒报告一次,共 5 次
| 字段 | 含义 |
|---|---|
| r | 运行队列长度(超过 CPU 核数说明有积压) |
| b | 等待 IO 的进程数 |
| si/so | swap 换入/换出(频繁则内存严重不足) |
| bi/bo | 磁盘读/写块数(高说明 IO 压力大) |
| wa | CPU 等待 IO 的比例 |
**lsof——**查进程打开了什么文件
# 某进程打开的所有文件,lsof 是排查端口冲突的首选工具
lsof -p 1234
# 谁在占用某个端口
sudo lsof -i :8080
sudo lsof -i :80 -i :443
# 谁在用某个文件(卸载磁盘前很有用)
lsof /var/log/syslog
# 某用户打开的文件
lsof -u fqy0610
**strace——**跟踪进程系统调用(排查神器)
[#strace](javascript:😉 输出可能很密集,查看网络相关调用
strace -e trace=network -p 1234
# 跟踪进程在调用什么系统调用
strace -p 1234
# 只显示文件相关调用
strace -e trace=file -p 1234
# 启动程序并跟踪
strace python script.py
# 如果只想让某个程序运行一段时间后自动停止
timeout 60s python script.py
# watch 可以定时执行命令并刷新输出,适合监控某个特定进程的状态变化
watch -n 2 “ps aux | grep nginx”
# 如果某个程序经常失控,可以限制其 CPU 运行时间不超过 60 秒
ulimit -t 60
💡 提示: strace 对排查"程序卡死/不响应"很有用,能看到进程到底在等什么(文件锁、网络请求、信号等)。
十一、速查表
进程查看
| 命令 | 作用 |
|---|---|
| ps aux | 查所有进程快照 |
| ps auxf | 树形显示 |
| pgrep nginx | 按名字找 PID |
| pstree -p | 进程树(显示 PID) |
| top | 实时监控(内置) |
| htop | 实时监控(增强版) |
进程控制
| 命令 | 作用 |
|---|---|
| kill | 优雅终止(SIGTERM) |
| kill -9 | 强制终止(SIGKILL) |
| kill -1 | 重载配置(SIGHUP) |
| pkill | 按名终止 |
| nice -n 10 cmd | 低优先级启动 |
| renice -n 10 -p | 调整运行中进程优先级 |
后台运行
| 命令 | 作用 |
|---|---|
| cmd & | 后台运行 |
| Ctrl+Z | 暂停 |
| bg | 继续在后台运行 |
| fg | 拉回前台 |
| jobs | 查看后台任务列表 |
| nohup cmd & | 关终端不停止 |
systemctl 服务管理
| 命令 | 作用 |
|---|---|
| systemctl status | 查状态 |
| systemctl start/stop/restart | 启停重启 |
| systemctl enable --now | 启动并开机自启 |
| journalctl -u -f | 实时查日志 |
💡 提示: 如果记不住所有命令,先记住这三条:htop 看资源、kill 停进程、systemctl管服务。
小结
| 场景 | 推荐工具 |
|---|---|
| 快速查谁在占 CPU/内存 | htop(彩色直观)或 top |
| 找某个服务的 PID | pgrep nginx |
| 优雅停止进程 | kill 或 pkill |
| 强制终止卡死进程 | kill -9 |
| 管理系统服务 | systemctl,搭配 journalctl 查日志 |
| 排查端口被谁占用 | sudo lsof -i : |
| 后台跑不间断的任务 | nohup cmd & 或 写成 systemd service |
更多推荐


所有评论(0)