Linux 进程管理

每个运行的程序在 Linux 里都是一个进程(process),有唯一的 PID。Linux 是多任务系统,同时跑几百个进程很正常。管理它们——查看、监控、终止——是后端开发和运维的日常。线上排查"服务卡死"也离不开这一篇。

1. 进程的基本概念

每个进程有一个唯一的PID(Process ID)。PID 1 永远是 initsystemd,它是所有其他进程的祖先。每个进程还有一个父进程(PPID)——启动它的那个进程。SSH 登录后,你的 shell 是 bash,你在 bash 里敲的每条命令启动的进程,bash 就是它们的父进程。

2. ps:列出进程快照

ps 是 "process status" 的缩写,给进程列表拍一张"快照"(对比 top 是连续录像)。

# ps:process status,列出当前进程

# 最常用的两种写法
ps aux                  # BSD 风格(a=所有用户,u=详细,x=无终端的也列)
ps -ef                  # System V 风格(效果类似)

# ps aux 输出列含义:
#   USER  PID  %CPU %MEM  VSZ   RSS   TTY  STAT START  TIME COMMAND
#   root  1    0.0  0.0   ...         ?    Ss   ...    0:01 /sbin/init
#         |                                       |
#         进程号(PID,唯一标识)              状态

# STAT 常见值:
#   R 运行中 / S 睡眠(等事件) / Z 僵尸 / T 停止
#   s 会话首领 / + 前台进程组 / l 多线程

# 常见用法
ps aux | grep nginx             # 找 nginx 进程
ps -ef | grep python
ps aux --sort=-%cpu | head -n 5 # CPU 占用前 5 的进程
ps aux --sort=-%mem | head -n 5 # 内存占用前 5 的进程

# 只看自己的进程
ps                              # 当前 shell 下的进程
ps -l                           # 长格式

最常用的就是 ps aux(BSD 风格,记这一个就够)。ps aux | grep nginx 找特定进程是日常必备。

3. top 与 htop:实时监控

top 是 Linux 自带的实时监控工具,启动后是个全屏界面,类似 Windows 的"任务管理器"。

# top:实时进程监控(Linux 版"任务管理器")
top
# 启动后是一个全屏界面,默认每 3 秒刷新
# 顶部显示系统概况:
#   Tasks: 234 total, 2 running, 232 sleeping
#   %Cpu(s): 5.0 us, 2.0 sy, 0.0 ni, 92.0 id
#   MiB Mem: 8000 total, 3000 free, 4000 used, 1000 buff/cache
# 下方是进程列表,默认按 CPU 占用排序

# 运行中的快捷键:
#   P   按 CPU 排序(默认)
#   M   按内存排序
#   N   按 PID 排序
#   T   按运行时间排序
#   1   展开每个 CPU 核心
#   k   杀进程(会问 PID)
#   q   退出

# 更友好的替代:htop(需 apt install htop)
htop
#   彩色界面、可上下选择、F9 杀进程、F6 排序

# 一次性快照,不进入交互界面
top -bn 1 | head -n 20          # -bn 1:只刷新一次

线上排查问题,第一步永远是 top。看哪个进程吃满 CPU、哪个吃满内存、整体负载多少。能用 htop 更好,彩色界面、操作直观。

4. kill:发送信号

kill 名字唬人,其实它是"给进程发信号"。默认发 SIGTERM(15),让进程优雅退出——进程收到信号后会做清理工作(关闭文件、保存数据)再退出。

# kill:给进程发信号(默认发 SIGTERM)

# 先用 ps 找到 PID,再 kill
ps aux | grep nginx             # 假设 PID 是 12345
kill 12345                      # 发 SIGTERM(15),让进程优雅退出
kill -15 12345                  # 等价于上一行(15 = SIGTERM)
kill -9 12345                   # 发 SIGKILL,强制杀(进程没机会清理)

# 常见信号
kill -l                         # 列出所有信号
#   1) SIGHUP    挂起(常用于让服务重载配置)
#   2) SIGINT    中断(Ctrl+C 发的就是这个)
#   9) SIGKILL   强制杀(不能被捕获或忽略,最后手段)
#   15) SIGTERM  终止(默认,优雅退出,推荐)

# 按名字杀(不用先查 PID)
killall nginx                   # 杀所有名为 nginx 的进程
pkill -f "python app.py"        # -f 匹配整条命令行
pkill -u aden                   # 杀用户 aden 的所有进程

# 安全建议:先 SIGTERM 给进程 5~10 秒优雅退出,
# 还不死再 SIGKILL。直接 -9 可能丢数据(尤其数据库)

SIGTERM vs SIGKILL 是关键区别:

安全流程:先 kill PID(发 15),等 5~10 秒;还活着再 kill -9 PID。直接 -9 是粗暴做法。

5. 资源监控:CPU、内存、磁盘

线上出问题通常就是这三类:CPU 跑满、内存爆掉、磁盘写满。top + free + df 是排查三件套:

# 系统资源监控

# 内存
free -h                         # -h 人可读(human),看内存和 swap
#         total   used   free   shared  buff/cache  available
# Mem:    7.7Gi   3.2Gi  1.5Gi  120Mi   3.0Gi       4.2Gi
# Swap:   2.0Gi   0      2.0Gi
#   "available" 才是程序实际能用的(含可回收缓存)

# 磁盘
df -h                           # 整体磁盘占用(每个分区)
df -h /                         # 看根分区
du -sh /var/log                 # 某目录占用大小(-s 汇总,-h 人可读)
du -sh * | sort -rh | head      # 当前目录各子项大小,从大到小
du -h --max-depth=1 /home       # 只看一层深度

# 网络(快速看端口和连接)
ss -tlnp                        # 监听中的 TCP 端口(比 netstat 新)
ss -ant                         # 所有 TCP 连接

# 综合
uptime                          # 运行多久、用户数、1/5/15 分钟平均负载
#   10:30:00 up 10 days, 3:00, 2 users, load avg: 0.50, 0.35, 0.25
#   负载小于 CPU 核心数就算健康(4 核机负载 < 4 即可)
uname -a                        # 内核信息
lscpu                           # CPU 信息
lsblk                           # 块设备(硬盘)

关于内存:新手常被 free 输出里的 used 吓到,以为内存快满了。其实要看 available——Linux 会把空闲内存拿去做磁盘缓存(buff/cache),程序要用时立刻释放。"Linux 内存越用越多"是正常现象,不是泄漏。

6. 后台运行、nohup、作业控制

有时你想让一个任务在后台跑,腾出终端继续干别的。有几种方式:

# 后台运行与守护

# &:把命令放后台运行(立刻返回 shell 提示符)
sleep 60 &
#   [1] 12345  ([1] 是作业号,12345 是 PID)
#   终端关了进程会被带走(SIGHUP)

# nohup:忽略挂断信号,终端关了进程还在
nohup node app.js &
#   输出默认写到 nohup.out

# 重定向输出到日志
nohup node app.js > app.log 2>&1 &
#   标准输出和错误都写到 app.log

# jobs:看当前 shell 的后台作业
jobs
#   [1]+ Running   sleep 60 &
fg %1                           # 拉回前台(foreground)
bg %1                           # 让Stopped的继续在后台跑
Ctrl+Z                          # 暂停前台进程,放后台(变成 Stopped)

# 现代做法:长期运行的服务用 systemd(后面专门讲),不用 nohup
# 一次性任务用 tmux/screen,断开后能重新连上

简单的临时任务用 & + nohup 就够。但生产环境的长期服务(数据库、Web 服务器),正确做法是用 systemd 或 Docker 管理——它们会自动重启崩溃的进程、收集日志、开机自启。这些后面专门讲。

7. 实战:线上排查的"三板斧"

每当有服务异常,记住这个排查顺序:

排查"端口被占"也是常见:ss -tlnp 看 80 端口被谁占了,或 sudo lsof -i :80(需装 lsof)。

8. /proc 文件系统(进阶)

Linux 把每个进程的信息都暴露在 /proc 目录下——这是"一切皆文件"哲学的极致体现:

小结

这一篇你学会了进程管理:ps aux 拍快照、top/htop 实时监控、kill 发信号(15 优先于 9)、free/df/du 看资源、nohup 后台运行。下一篇讲把这些工具串起来的"螺丝"——管道和重定向。

← 上一篇 Linux 文本处理

下一篇 Linux 管道与重定向

✈️💬