进程是什么

每个跑着的程序 = 一个进程。每个进程有:

  • PID(Process ID):唯一编号
  • PPID(Parent PID):谁启动了它
  • UID:以哪个用户身份在跑
  • 状态:跑(R)、睡(S)、僵尸(Z)等

ps:看进程快照

ps                       # 看当前 shell 里的进程
ps -ef                   # 全系统所有进程(System V 风格)
ps aux                   # 全系统所有进程(BSD 风格,更常用)
ps aux | grep nginx      # 找 nginx 相关进程
ps -ef --forest          # 树状显示父子关系

ps aux 输出列:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
wadely    1234  0.1  0.5  21424  5680 pts/0    Ss   10:23   0:00 -bash
  • VSZ:虚拟内存(不真占用)
  • RSS:实际占用物理内存(关心这个)
  • STAT:状态(R=running, S=sleep, Z=zombie, D=disk wait)

top / htop:实时监控

top                      # 系统自带,实时

操作快捷键:

  • q 退出
  • M 按内存排序
  • P 按 CPU 排序
  • k 杀进程
  • 1 显示每个核
  • c 显示完整命令
htop                     # 更友好的 top(需要装:sudo apt install htop)

htop 操作:

  • 方向键选进程
  • F9 杀进程
  • F5 树状视图
  • / 搜索
  • F4 过滤

服务器上优先装 htop——top 默认但难用。

kill:发信号给进程

kill 1234                # 发 SIGTERM(15,温柔结束)
kill -9 1234             # 发 SIGKILL(9,强制结束,不能挡)
kill -HUP 1234           # 发 SIGHUP(1,重载配置)
kill -l                  # 看所有信号

常用信号:

信号 数字 含义
SIGTERM 15 温和结束(默认)—— 让程序自己清理后退出
SIGKILL 9 强制结束 —— 内核直接杀,不可阻挡
SIGHUP 1 挂起 —— 很多服务用它做"重载配置"
SIGINT 2 中断 —— 等同 Ctrl+C
SIGSTOP 19 暂停 —— 不能阻挡
SIGCONT 18 继续

优先用 kill(15),实在不响应再 kill -9。强杀可能让程序留下不一致状态(数据文件、锁等)。

killall / pkill:按名字杀

killall nginx                  # 杀所有 nginx 进程
killall -9 stuck-app           # 强杀
pkill -f "python myapp.py"     # 按命令行完整匹配
pgrep nginx                    # 只列 PID 不杀
pgrep -af nginx                # 详细

进程的常见状态

R   running       正在运行 / 可运行
S   sleeping      睡眠(等事件)
D   disk wait     不可中断的睡眠(等磁盘 IO,杀不掉)
Z   zombie        僵尸(已死但父进程没回收)
T   stopped       已停止

僵尸进程:子进程死了但父进程没调 wait() 回收。少量正常;大量僵尸 → 父进程有 bug。

ps aux | grep ' Z '            # 找僵尸

实战

1. 找内存最多的 5 个进程

ps aux --sort=-%mem | head -6

2. 看某个用户的所有进程

ps -u wadely

3. 看进程的完整启动命令

ps -ef | grep nginx
# 或
cat /proc/<pid>/cmdline

4. 看进程打开了哪些文件

sudo lsof -p 1234

下一篇:让进程在后台跑(脱离终端)。